【问题标题】:Execute Button Method执行按钮方法
【发布时间】:2015-04-23 12:15:36
【问题描述】:

我正在尝试在按下按钮时执行 Tkinter ttk Button 方法,这意味着我希望该方法在按下按钮时继续执行并在我释放它时停止,但我不太明白.这是代码。

from tkinter import *
from tkinter import ttk

class stuff (object):

    def __init__(self, master):

        master.title("Grid Master")
        master.frame_1 = ttk.Frame(master)
        master.frame_1.pack()
        master.configure(background = "#FFFFFF")

        self.button = ttk.Button(master, text = 'Press', command = self.callback)
        self.button.pack()

    def callback(self):
        print ("Hello world")


def main():
    root = Tk()
    loop = stuff(root)
    root.mainloop()

if __name__ == '__main__':
    main()

你可以在代码中看到该方法只打印"Hello world",我希望这个函数执行并继续,打印Hello world,直到我释放按钮。

【问题讨论】:

  • 你能修复代码块中的缩进吗?这对 Python 来说非常重要……
  • 缩进没有问题!
  • 现在我确实看得很清楚了。 :-)
  • @mhawke 修复了缩进..
  • @Omera:是的,看看答案——fhdrsdg 的答案特别好。

标签: python button tkinter


【解决方案1】:

您可以使用root.after() 重复安排作业以执行所需的任务。请注意,我已将按钮事件更改为在按下按钮时激活,并在释放按钮时终止“之后”作业。

try:
    from tkinter import *
    from tkinter import ttk
except ImportError:
    # Python 2, probably
    from Tkinter import *
    import ttk

class stuff (object):
    def __init__(self, master):
        self._master = master
        master.title("Grid Master")
        master.frame_1 = ttk.Frame(master)
        master.frame_1.pack()
        master.configure(background = "#FFFFFF")

        self.button = ttk.Button(master, text = 'Press')
        self.button.bind("<Button-1>", self.button_pressed)
        self.button.bind("<ButtonRelease-1>", self.button_released)
        self.button.pack()

        self.hello_world_frequency = 1    # milliseconds 

    def hello_world(self):
        print ("Hello world")
        self._job = self._master.after(self.hello_world_frequency, self.hello_world)

    def button_pressed(self, event):
        print ("Button down")
        self.hello_world()

    def button_released(self, event):
        print ("Button released")
        self._master.after_cancel(self._job)


def main():
    root = Tk()
    loop = stuff(root)
    root.mainloop()

if __name__ == '__main__':
    main()

【讨论】:

  • @Rinzler:在我的系统上是 Tkinter,但对于 OP 来说是 tkinter,所以感谢您的编辑。
【解决方案2】:

您可以创建一个自定义的重复 ttk 按钮类,它继承自 ttk.Button,但添加了基本的重复功能。

试试这个。你可以像这样使用它

self.button = RepeatButton(master, text='Press', command=self.callback)

您可以设置 repeatdelayrepeatinterval 参数,默认为 300 和 100。

class RepeatButton(ttk.Button):
    def __init__(self, *args, **kwargs):

        self.callback = kwargs.pop('command', None)
        self.repeatinterval = kwargs.pop('repeatinterval', 100)
        self.repeatdelay = kwargs.pop('repeatdelay', 300)

        ttk.Button.__init__(self, *args, **kwargs)

        if self.callback:
            self.bind('<ButtonPress-1>', self.click)
            self.bind('<ButtonRelease-1>', self.release)

    def click(self, event=None):
        self.callback()
        self.after_id = self.after(self.repeatdelay, self.repeat)

    def repeat(self):
        self.callback()
        self.after_id = self.after(self.repeatinterval, self.repeat)

    def release(self, event=None):
        self.after_cancel(self.after_id)

【讨论】:

  • 这很好。与我的答案相同的方法,但打包在一个可重用的类 +1 中。
  • @mhawke 谢谢,你的也很好用。它可能比我的更不言自明,这对 OP 可能更有用。实际上我也开始制作类似的东西,但后来我找到了this,这让我想到了把它放在课堂上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-21
相关资源
最近更新 更多