簡體   English   中英

在Tkinter窗口中調用包含'time.sleep()'的外部函數

[英]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)),這會更有效且更干凈。

謝謝。

通常,不要在單個線程的GUI中調用time.sleep ,否則您將發現它導致其阻塞。

處理睡眠的正確方法是使用GUI事件。

請參閱另一個堆棧溢出問題中的示例, 問題說明了如何使用所有TK根窗口具有的after方法。

我完全同意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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM