gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:50:34 25 4
gpt4 key购买 nike

我目前正在学习 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com