Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Tkinter窗口中调用包含“time.sleep()”的外部函数_Python_Tkinter - Fatal编程技术网

Python 在Tkinter窗口中调用包含“time.sleep()”的外部函数

Python 在Tkinter窗口中调用包含“time.sleep()”的外部函数,python,tkinter,Python,Tkinter,我试图通过按下Tkinter GUI中的按钮来调用外部函数;函数“insert”插入到文本元素中。这是完美的;只要时间不紧跟着它。睡觉。如果没有遵循,文本将正确更新;如果是,则文本不会更新,尽管函数似乎仍在运行循环,因为它会很高兴地将文本打印到控制台 下面是我的示例脚本: from Tkinter import * from time import sleep def test_function(gui_self): while True: print "Debug m

我试图通过按下Tkinter GUI中的按钮来调用外部函数;函数“insert”插入到文本元素中。这是完美的;只要时间不紧跟着它。睡觉。如果没有遵循,文本将正确更新;如果是,则文本不会更新,尽管函数似乎仍在运行循环,因为它会很高兴地将文本打印到控制台

下面是我的示例脚本:

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_函数更改为以下内容似乎会把事情搞砸:

def test_function(gui_self):
    while True:
        print "Debug message"
        gui_self.main_.insert(END, "Test")
        sleep(5)
有什么建议可以纠正我在这里做错的地方吗?我确信这只是一个问题,作为一个相当基础的用户,我没有使用正确的语法

顺便说一句,“sleep”命令似乎也完全冻结了程序,我觉得这很烦人,也没有吸引力。是否有一种方法可以暂停循环一个可变的设置,例如,var=1秒的时间,而不是“管道”线程,这将是高效和更有效的。。干净

谢谢。

通常不要调用time。请在单线程GUI中睡眠,否则您会发现它会被阻塞

处理睡眠的正确方法是使用GUI事件

请参阅本示例,该示例演示了如何使用所有TK根窗口都具有的after方法。

一般来说,不要在单线程GUI中调用time.sleep,否则会导致它被阻塞

处理睡眠的正确方法是使用GUI事件


请看下面这个例子,它展示了如何在所有TK根窗口都有之后使用这种方法。

我完全同意Nick Craig Wood的回答-不要让gui的主线程处于休眠状态。通常,您希望在大约X毫秒后调用,然后注册一个要调用的函数。下面是一个每5秒调用test_函数的示例。每次调用test_函数时,它都会重新注册,以便在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_uu而不仅仅是main?通常,尾随下划线附加到与python关键字冲突的AVOID名称。据我所知,main不是一个关键词。

我完全同意Nick Craig Wood的回答-不要让gui的主线程处于休眠状态。通常,您希望在大约X毫秒后调用,然后注册一个要调用的函数。下面是一个每5秒调用test_函数的示例。每次调用test_函数时,它都会重新注册,以便在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_uu而不仅仅是main?通常,尾随下划线附加到与python关键字冲突的AVOID名称。据我所知,main不是关键字。

请阅读事件循环。基本上,当程序卡在函数中时,它无法更新GUI。这里有一个很好的tkinter资源:阅读事件循环。基本上,当程序卡在函数中时,它无法更新GUI。这里有一个很好的tkinter资源:谢谢,这似乎可以阻止程序完全崩溃:在本例中,我使用了trailing,因为我已经从导入中包含了一个“main”:这是一个恼人的函数名,但我在第一次学习python时编写了导入。你只是提醒我要换一下。再次感谢。@abkai-即使您使用模块导入main,您仍然可以拥有一个名为main的属性的类。哦,我想这是真的,哈哈。习惯的力量,当我写剧本的时候,我没有在课堂上写,然后我把它移到一个课堂上,试图整理我的作品,我甚至没有想过要改变它;仍然在学习python:PThank you,这似乎可以阻止程序完全崩溃:在本例中,我使用了trailing,因为我已经从导入中包含了一个“main”:这是一个恼人的函数名,但我在第一次开始学习python时编写了导入。你只是提醒我要换一下。再次感谢。@abkai-即使您使用模块导入main,您仍然可以拥有一个名为main的属性的类。哦,我想这是真的,哈哈。习惯的力量,当我写剧本的时候,我没有在课堂上写,然后我把它移到一个课堂上,试图整理我的作品,我甚至没有想过要改变它;仍在学习python:P