Python&PyGTK : Stop while on button click

标签 python button click while-loop pygtk

我正在编写一些应用程序,我想在单击按钮时创建 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/

相关文章:

javascript - 每次点击都会调用函数两次

python - 为什么 plt.figure(figsize) 在绘制 pd.DataFrame 和 pd.Series 时呈现不同的结果?

iphone - 我可以在 Xcode 4.6 中禁用约束吗?

c# - 使用 C# 查找 live 的区域部分

javascript - jQuery 单击处理程序在多次单击后运行缓慢

button - 商家如何知道客户是否已通过 PayPal 提供的 "Make a button"付款?

python - 如何计算 NetworkX 中单个节点的介数中心性?

python - 计算一个字符串在python中其他字符串中的出现次数

python - wxPython:在现有 wx.Panel 上覆盖 wx.Panel 的好方法

c# - 具有确定操作的 Caliburn MVVM WPF 对话框