【问题标题】:Loop triggered by Tkinter button and ended by another循环由 Tkinter 按钮触发并由另一个按钮结束
【发布时间】:2018-09-06 22:10:19
【问题描述】:

以下代码将显示一个小的 Tkinter 用户界面,但是我的按钮不会触发名为 copy_loop 的循环。我已经尝试了几个小时,但我无法弄清楚如何解决这个问题。任何帮助将不胜感激。

import tkinter as tk
import threading

class App():
    def __init__(self, master):
        self.isrunning = False

        self.button1 = tk.Button(main, text='start')
        self.button1.bind = ("<Button-1>", self.startrunning)
        self.button1.pack()

        self.button2 = tk.Button(main, text='stop')
        self.button2.bind = ("<Button-1>", self.stoprunning)
        self.button2.pack()

    def startrunning(self, event):
        self.isrunning = True
        t = threading.Thread(target=self.copy_loop)
        t.start()

    def stoprunning(self, event):
        self.isrunning = False

    def copy_loop(self):
        while self.isrunning:
            print("Running...")

main = tk.Tk()
app = App(main)
main.mainloop()

【问题讨论】:

    标签: python tkinter python-3.7


    【解决方案1】:

    bind 是一个函数,而不是一个属性。你在哪里:

    self.button1.bind = ("<Button-1>", self.startrunning)
    

    您实际上是在覆盖您实例上的bind 函数。它现在是一个元组。

    改为:

    self.button1.bind("<Button-1>", self.startrunning)
    

    button2 也是如此。

    【讨论】:

      【解决方案2】:

      你有一个不应该有的等号。命令应该是:

      self.button1 = tk.Button(main, text='start')
      self.button1.bind("<Button-1>", self.startrunning)
      

      或者更整洁:

      self.button1 = tk.Button(main, text='start', command=self.startrunning)
      

      你的方法签名应该有event=None

      def startrunning(self, event=None):
      

      甚至更灵活:

      def startrunning(self, *args):
      

      【讨论】:

        猜你喜欢
        • 2020-08-01
        • 1970-01-01
        • 2013-08-23
        • 2011-11-23
        • 2021-07-18
        • 1970-01-01
        • 1970-01-01
        • 2016-11-12
        • 2020-06-01
        相关资源
        最近更新 更多