我正在编写一些应用程序,我想在单击按钮时创建 while 循环,如果再次单击它以停止它。这是按钮的代码:
self.btnThisOne = gtk.Button("This one")
self.btnThisOne.connect("clicked", self.startLoop)
startLoop def 的代码是:
def startLoop(self):
while self.btnThisOne?(is_clicked)?:
#do something
怎么做?
最佳答案
不幸的是,您不能只在应用程序的主线程中运行不受约束的 while 循环。这将阻止主要的 gtk event loop并且您将无法处理更多事件。您可能想要做的是生成一个线程。
您是否考虑过使用 ToggleButton
而不是 GtkButton
?最接近 is_clicked
方法的是 is_active
,您会在切换按钮中找到它。
这是一个根据切换按钮的状态启动和控制线程的示例(将 triggered
替换为 clicked
并将 ToggleButton
替换为 Button
如果你想要一个常规按钮):
import gtk, gobject, threading, time
gobject.threads_init()
window = gtk.Window()
button = gtk.ToggleButton('Start Thread')
class T(threading.Thread):
pause = threading.Event()
stop = False
def start(self, *args):
super(T, self).start()
def run(self):
while not self.stop:
self.pause.wait()
gobject.idle_add(self.rungui)
time.sleep(0.1)
def rungui(self):
pass # all gui interaction should happen here
thread = T()
def toggle_thread(*args):
if not thread.is_alive():
thread.start()
thread.pause.set()
button.set_label('Pause Thread')
return
if thread.pause.is_set():
thread.pause.clear()
button.set_label('Resume Thread')
else:
thread.pause.set()
button.set_label('Pause Thread')
button.connect('toggled', toggle_thread, None)
window.add(button)
button.show()
window.show()
gtk.main()
这个 PyGTK FAQ answer可能会有所帮助。干杯。
关于Python&PyGTK : Stop while on button click,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13108018/