python - Tkinter GUI 中的多线程,不同类中的线程

标签 python python-2.7 python-3.x tkinter python-multithreading

我目前正在学习 Tkinter GUI 编程。我被困在多线程概念的某个地方。尽管这个话题在这里讨论了好几次,我还是没能理解这个概念并将其应用到我的小示例程序中。

下面是我的代码:

from PIL import Image, ImageTk 
from Tkinter import Tk, Label, BOTH
from ttk import Frame, Style
from Tkinter import *
import time


class Widgets(Frame):

    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.grid()
        self.parent = parent
        self.initUI(parent)

    def initUI(self, parent):
        self.parent.title("Count Numbers")

        for r in range(10):
            self.parent.rowconfigure(r, weight=1)    
        for c in range(10):
            self.parent.columnconfigure(c, weight=1)        

        self.button1 = Button(parent, text = "count")
        self.button1.grid(row = 1, column = 1, rowspan = 1, columnspan = 2, sticky = W+E+N+S )
        self.button1["command"] = self.countNum

        self.button2 = Button(parent, text = "say Hello")
        self.button2.grid(row = 1, column = 7, rowspan = 1, columnspan = 2, sticky = W+E+N+S) 
        self.button2["command"] = PrintHello(self).helloPrint

    def countNum(self):
        for i in range(10):
            print i
            time.sleep(2)   

class PrintHello(Frame):

    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.grid()
        self.parent = parent

    def helloPrint(self):
        print "Hello"

def main():
    root = Tk()
    root.geometry("300x200")
    app = Widgets(root)
    root.mainloop()

if __name__ == '__main__':
    main() 

enter image description here

输出是一个带有 2 个按钮的 GUI - 第一个打印数字,第二个打印“Hello”。但是在单击第一个按钮时,GUI 会在打印数字时卡住。在寻找解决方案时,我发现“多线程”可能会有所帮助。但是经过多次尝试,我无法将多线程应用到我给出的示例程序中。

最佳答案

这么简单的事情不需要线程。

GUI 卡住是因为您将 time.sleep 放入函数中,该函数阻塞主线程直到它完成。

只需使用 Tk 内置的 after 方法。将您的功能更改为。

def countNum(self, num=0):
    if num < 10:
        print num
        root.after(2000, lambda: self.countNum(num + 1))
    else:
        print "Stopping after call"

after 方法采用以下参数:

after(delay_ms, callback, arguments)

时间以毫秒为单位,1000 毫秒 = 1 秒。因此,我们通过 2,000 毫秒延迟 2 秒。

关于python - Tkinter GUI 中的多线程,不同类中的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36969724/

相关文章:

python - 为什么 Python 2.7.3 认为我的 .csv 文件都在一行上?

python - BeautifulSoup </div> 抓取突然停止工作

python-3.x - 使用 NaN 计算 pct_change 时如何避免 bfill 或 ffill

c# - 是否可以在 Linux 中从 Python 调用 C# dll?

python - Python3.7中将用户的输入与嵌套字典匹配

python - 设置区域设置和字符串模块

python - 使用 BeautifulSoup 提取时保留某些 HTML 标签

Python:用户选择 int 或 float

python - 多重继承自 QObject 和 QRunnable 错误

python - python 交互式词典程序