Почему Python пропускает код Tkinter? - PullRequest
1 голос
/ 07 октября 2019

Я в Python 3.x и использую Tkinter, чтобы создать кнопку, которая изменяет значение логической переменной с true на false, а затем оператор if, чтобы проверить, является ли это значение false. Вот мой код для этого:

import tkinter
import time

x = True

top = tkinter.Tk()

def helloCallBack():
   x = False
   print (x)

B = tkinter.Button(top, text ="Hello", command = helloCallBack)
B.pack()

if x == False:
   print ('Hello')

top.mainloop()

К сожалению, это не сработало, поэтому я заменил оператор if на time.sleep (10), а затем напечатал (x), чтобы у меня было достаточно времени, чтобынажмите кнопку следующим образом:

import tkinter
import time

x = True

top = tkinter.Tk()

def helloCallBack():
   x = False
   print (x)

B = tkinter.Button(top, text ="Hello", command = helloCallBack)
B.pack()

time.sleep(10)
print (x)

top.mainloop()

Проблема в том, что он пропускает весь код Tkinter и переходит к time.sleep (10), печатает значение x, затем выводит все из Tkinter вверхпосле. Почему он это делает?

1 Ответ

1 голос
/ 07 октября 2019

Причина, по которой вы видите, что код выполняет sleep(), а затем печатает True до открытия окон tkinter, вызвана тем, как mainloop() работает в tkinter.

sleep() полезна в pythonоднако из-за однопоточной природы tkinter все, что может sleep(), может блокировать основной цикл, пока он не завершит спящий режим. У Tkinter есть собственный метод для решения этой проблемы, который называется after(), и он вам здесь не нужен, но он очень полезен для определения времени в tkinter.

Tkinter обновляет информацию в основной лупе, и у вас естьsleep() команда, которая появляется перед вашей основной группой, а также команда печати перед основной областью. Обе эти вещи должны завершить выполнение до того, как основной цикл будет достигнут в первый раз, таким образом, не позволяя tkinter запускаться до тех пор, пока они не будут завершены.

То, что вы хотите сделать, это поместить этот оператор print в вашу функцию. А также несколько других улучшений качества жизни.

См. Этот пример:

import tkinter as tk


top = tk.Tk()
x = True


def hello_call_back():
    global x
    x = False
    if not x:
        print('Hello')


tk.Button(top, text="Hello", command=hello_call_back).pack()
top.mainloop()

Однако в этом случае я думаю, что самая простая форма кода должна выглядеть следующим образом:

import tkinter as tk


top = tk.Tk()


def hello_call_back():
    print('Hello')


tk.Button(top, text="Hello", command=hello_call_back).pack()
top.mainloop()

Поскольку текущее использование x избыточно для цели.

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