Aas*_*daq 1 python user-interface tkinter button frame
我的问题与此类似:Python TKinter multiple actions。但是,提供的答案对我没有帮助,因为它指向一篇包含可能使用的函数列表的文章。我想看看该解决方案的实际实施。
我的问题:我的框架上有两个按钮。只要切换变量设置为 true,一键即可调用“执行”函数。第二个按钮将切换值设置为 False。我希望“执行”功能在按下执行按钮后继续运行,但在按下第二个(切换错误)按钮时停止。然而,一旦我按下“执行”,框架就会卡住。我理解它是因为回调。我怎样才能解决这个问题?这是我的示例代码:
from Tkinter import *
from time import sleep
class App:
def __init__(self, master):
self.toggle = False
frame = Frame(master)
frame.pack()
self.exeButton = Button(frame, text="Execute", fg="blue", command=self.execute)
self.exeButton.pack(side=LEFT)
self.tOffButton = Button(frame, text="Toggle Off", command=self.toggleOff)
self.tOffButton.pack(side=LEFT)
def execute(self):
self.toggle = True
while(self.toggle):
print "hi there, everyone!"
sleep(2)
def toggleOff(self):
self.toggle = False
root = Tk()
app = App(root)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
简短的回答,你不能完全做你想做的事。Tkinter 是单线程的——当您调用sleep(2)它时,它会完全按照您的要求执行:它会休眠。
如果您的目标是只要布尔标志设置为 True,则每 2 秒执行一次某些操作,则可以使用after来安排将来运行的作业。如果该作业也使用 after 来(重新)调度自身,那么您实际上创建了一个无限循环,其中实际的循环机制是事件循环本身。
我已经获取了您的代码并做了一些细微的修改,以向您展示如何连续执行某些操作,直到标志告诉它停止。我冒昧地将“toggle”重命名为“running”,以使其更容易理解。我还只使用一个方法来打开和关闭执行。
from Tkinter import *
from time import sleep
class App:
def __init__(self, master):
self.master = master
self.running = False
frame = Frame(master)
frame.pack()
self.exeButton = Button(frame, text="Execute", fg="blue",
command=lambda: self.execute(True))
self.exeButton.pack(side=LEFT)
self.tOffButton = Button(frame, text="Toggle Off",
command=lambda: self.execute(False))
self.tOffButton.pack(side=LEFT)
def execute(self, running=None):
if running is not None:
self.running = running
if self.running:
print "hi there, everyone!"
self.master.after(2000, self.execute)
root = Tk()
app = App(root)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1064 次 |
| 最近记录: |