Код Tkinter не выполняется после разрушения окна - PullRequest
0 голосов
/ 03 сентября 2018
from tkinter import *
from random import *


root = Tk()

#A function to create the turn for the current player. The current player isnt in this code as it is not important
def turn():
    window = Toplevel()  
    dice = Button(window, text="Roll the dice!", bg= "white", command=lambda:diceAction(window))
    dice.pack()
    window.mainloop()

#a function to simulate a dice. It kills the function turn.
def diceAction(window):
    result = Toplevel()
    y = randint(1, 6)
    # i do something with this number
    quitButton = Button(result, text="Ok!", bg="white", command=lambda: [result.destroy(), window.destroy()])
    quitButton.pack()
    window.destroy()
    result.mainloop()


#A function to create the playing field and to start the game
def main():
    label1 = Button(root, text="hi", bg="black")

    label1.pack()


    while 1:
        turn()
        print("Hi")
        turn()


main()

root.mainloop()

С этим кодом я в основном создаю симулятор броска костей. В моем собственном коде я даю функцию turn () player1 / player2 (которые являются объектами класса), чтобы я мог отслеживать, чей это ход. Вот почему я вызываю turn () 2 раза.

Проблема в том, что код после первого поворота () больше не выполняется (пока я вручную не закрою корневое окно, что странно). Насколько я знаю, это должно работать.

Я открываю функцию поворота, которая открывает функцию diceAction после нажатия кнопки. diceAction () дает мне номер и убивает оба окна. Затем должен быть вызван второй поворот (), и процесс продолжается до тех пор, пока кто-то не победит (что я не реализовал в этом коде). Печать («Привет») также не выполняется. Я что-то пропустил? Вы можете скопировать этот код и выполнить его самостоятельно.

1 Ответ

0 голосов
/ 03 сентября 2018

Короткий ответ: «Бесконечные циклы и tkinter не очень хорошо играют вместе». Длинный ответ таков: вы никогда не избежите window.mainloop(). Я не вижу достаточно веской причины, по которой вам нужно запустить window.mainloop() и result.mainloop(), чтобы оправдать головную боль от нескольких циклов в tkinter.

A субъективно лучший способ сделать это состоит в том, чтобы конец первого turn() инициировал начало следующего:

from tkinter import *
from random import *

root = Tk()

global turnCount
turnCount = 0

def turn():
    window = Toplevel()
    dice = Button(window, text="Roll the dice!", bg="white", command=lambda:diceAction())
    dice.pack()

def diceAction():
    result = Toplevel()
    y = randint(1, 6)
    quitButton = Button(result, text="Ok!", bg="white", command=lambda: nextTurn())
    quitButton.pack()

def nextTurn():
    global turnCount
    turnCount = turnCount + 1
    for i in root.winfo_children():
        if str(type(i)) == "<class 'tkinter.Toplevel'>":
            i.destroy()
    turn()

def main():
    label1 = Button(root, text="hi", bg="black")
    label1.pack()
    turn()

main()

root.mainloop()

Я бы порекомендовал попытаться использовать ООП в таком проекте вместо global, который я объявил выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...