Остановить Tkinter от открытия второго окна при импорте функции рисования - PullRequest
0 голосов
/ 27 октября 2018

У меня возникла проблема, которую я не могу решить.Я делаю интерфейс Python с Tkinter, который позволяет пользователю рисовать предопределенную фигуру с некоторыми параметрами (число и длина).Предопределенная функция figure "tree" находится во втором файле python.Приложение работает нормально, если функция «дерево» находится в основном файле Python, т.е. все рисует в одном окне.Если я помещу фигуру «дерево» во второй файл Python (figure.py) и попытаюсь импортировать ее, приложение создаст второе окно, и вместо предполагаемого главного окна будет отображаться фигура дерева.Как я могу ссылаться и импортировать функцию, чтобы она рисовала в главном окне приложения.Спасибо!

основной файл 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()

figure.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)

1 Ответ

0 голосов
/ 27 октября 2018

Приложение работает нормально, если функция «дерево» находится в основном файле питона, т.е. все рисует в одном окне.Если я помещу фигуру «дерево» во второй файл Python (figure.py) и попытаюсь импортировать ее, приложение создаст второе окно, и вместо предполагаемого главного окна будет отображаться фигура дерева.

Проблема в том, что figure.py настраивает среду черепахи, независимую от основной программы - не позволяйте этому.Передайте в функции figure.py все, что им нужно для работы в среде черепахи основной программы:

figure.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 функция.

...