阻止 Tkinter 在导入绘图功能时打开第二个 window

Stop Tkinter from opening a second window when importing drawing function

我遇到了无法解决的问题。我正在使用 Tkinter 制作一个 Python 界面,允许用户使用一些参数(数字和长度)绘制预定义图形。预定义图形函数 "tree" 在第二个 python 文件中。如果 "tree" 函数在主 python 文件中,即所有内容都在一个 window 中,则应用程序运行良好。如果我将图形 "tree" 放入第二个 python 文件 (figures.py) 并尝试导入它,应用程序将创建第二个 window 并且树形图将绘制在那里预期的主要 window。我如何引用和导入该函数,以便它在主应用程序中绘制 window。谢谢!

主要python文件

import turtle
import tkinter
from tkinter.ttk import *
import figures

# Main function is defined.
def main():
    # Set root and create canvas
    root = tkinter.Tk()
    root.title("Draw")
    canvas = tkinter.Canvas(root, width=800, height=700)
    canvas.pack(side=tkinter.RIGHT)

    # create a turtle to draw on the canvas 
    pen = turtle.RawTurtle(canvas)
    screen = pen.getscreen()

    # Set screen co-ordinates.
    screen.setworldcoordinates(-200, -700, 800, 700)
    screen.bgcolor("grey")

    # Draw frame  
    frame = tkinter.Frame(root, bg="white")
    frame.pack(side=tkinter.LEFT, fill=tkinter.BOTH)

    pointLabel = tkinter.Label(frame, text="Fractal", bg="white", )
    pointLabel.pack()

    # make the dropdown for fractal  list
    turtleNames = ["Tree", "Dandelion"]
    turtleStr = tkinter.StringVar()
    turtleList = OptionMenu(frame, turtleStr, turtleNames[0], *turtleNames)
    turtleList.pack()

    numberLabel = tkinter.Label(frame, text="Number")
    numberLabel.pack()

    # the entry widget must be given a string.
    number = tkinter.StringVar()
    numberEntry = tkinter.Entry(frame, textvariable=number)
    numberEntry.pack()
    number.set(str(3))

    lengthLabel = tkinter.Label(frame, text="Length")
    lengthLabel.pack()

    # User sets length
    length = tkinter.StringVar()
    lengthEntry = tkinter.Entry(frame, textvariable=length)
    lengthEntry.pack()
    length.set(str(200))

    def drawHandler():
        # get the value from orderStr and make int
        num = int(number.get())

        # get the value from lengthStr and make int
        len = int(length.get())

        figures.tree(num, len)

    # Event handler to clear canvas for a new drawing
    def clearHandler():
        pen.clear()

    # This is an event handler. Handling the quit button press results in quitting the application.
    def quitHandler():
        root.destroy()
        root.quit()

    # Draw Buttons

    # presses of the "Draw" button.
    drawButton = tkinter.Button(frame, text="Draw", command=drawHandler)
    drawButton.pack()

    # presses of the "Clear" button.
    clearButton = tkinter.Button(frame, text="Clear", command=clearHandler)
    clearButton.pack()

    # presses of the "Quit" button.
    quitButton = tkinter.Button(frame, text="Quit", command=quitHandler)
    quitButton.pack()

    # tells the application to enter its event processing loop
    tkinter.mainloop()

# Python jumps right here after executing the def main() line. These two lines tell
if __name__ == "__main__":
    main()

figures.py 用于存储预定义设计

from turtle import *

pen = Pen()

screen = Screen()


# 1st figure Tree
def tree(n, l):
    if n == 0 or l < 2:
        return
    # endif
    pen.forward(l)
    pen.left(45)
    tree(n - 1, l / 2)
    pen.right(90)
    tree(n - 1, l / 2)
    pen.left(45)
    pen.backward(l)

The app runs fine if the "tree" function is in the main python file i.e everything draws in one window. If I put the figure "tree" in a second python file (figures.py) and try to import it the app will create a second window and the tree figure will draw there instead of the intended main window.

问题是 figures.py 正在设置一个独立于主程序的 turtle 环境 -- 不要让它。传递给 figures.py 函数在主程序的 turtle 环境中需要操作的任何东西:

figures.py

# 1st figure Tree
def tree(pen, number, length):
    if number == 0 or length < 2:
        return

    pen.forward(length)
    pen.left(45)
    tree(pen, number - 1, length / 2)
    pen.right(90)
    tree(pen, number - 1, length / 2)
    pen.left(45)
    pen.backward(length)

# test this code standalone
if __name__ == "__main__":
    import turtle

    tree(turtle.getpen(), 5, 100)  # test using default turtle

    turtle.exitonclick()

文件底部的代码供您独立测试此文件。当导入到主程序中时,它将被忽略。现在我们只需要对主程序做一个小改动:

主要python文件

def drawHandler():
    # get the value from orderStr and make int
    number_int = int(number.get())

    # get the value from lengthStr and make int
    length_int = int(length.get())

    figures.tree(pen, number_int, length_int)

我在您重新定义 Python 的内置 len 函数时更改了变量名称。