[英]Calling an external function that contains 'time.sleep()' within a Tkinter window
我試圖通過按下Tkinter GUI中的按鈕來調用外部函數; 函數“插入”到Text元素中。 這很完美; 只要沒有緊隨其后的time.sleep()。 如果未遵循,則文本將正確更新。 如果是,則文本不會更新,盡管該函數似乎仍在運行循環,因為它將很高興將文本打印到控制台。
這是我的示例腳本:
from Tkinter import *
from time import sleep
def test_function(gui_self):
while True:
print "Debug message"
gui_self.main_.insert(END, "Test")
class GUI:
def __init__(self, master):
frame = Frame(master, width=300, height=500)
frame.pack()
self.main_ = Entry(frame, width=80, justify=CENTER)
self.main_.pack()
test_function(self)
root = Tk()
application = GUI(root)
root.mainloop()
這很好。 但是,將test_function更改為以下內容似乎會使事情變得混亂:
def test_function(gui_self):
while True:
print "Debug message"
gui_self.main_.insert(END, "Test")
sleep(5)
有什么建議可以解決我在這里做錯的事情嗎? 作為一個基本的用戶,我確定這只是一個問題,我沒有為其使用正確的語法。
順便提一句,“ sleep”命令似乎也完全凍結了程序,我覺得這很煩人並且沒有吸引力。 除了“管道”線程之外,是否有一種方法可以使循環暫停一段可變的時間(例如,var = 1(second)),這會更有效且更干凈。
謝謝。
我完全同意Nick Craig-Wood的回答-不要讓gui的主線程進入睡眠狀態。 通常,您要在調用after
注冊(大約)X毫秒后要調用的函數。 這是一個示例,每5秒調用一次test_function
。 每次調用test_function時,它將在5秒后重新注冊為自身。
def test_function(gui_self):
print "Debug message"
gui_self.main_.insert(END, "Test")
gui_self.after(5000,test_function,gui_self)
#the line below also should work. As long as the item is a Tkinter widget
#gui_self.main_.after(5000,test_function,gui_self)
另外,完全不相關(但僅作為樣式問題)–是否有理由在GUI
使用main_
而不是僅使用main
? 通常,結尾的下划線會使用python關鍵字附加到aviod名稱沖突中。 據我所知, main
不是關鍵字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.