Python 执行按钮方法
我试图在按下按钮时执行Tkinter ttk Button方法,这意味着我希望该方法在按下按钮时继续执行,在释放按钮时停止,但我无法完全理解。这是代码Python 执行按钮方法,python,button,tkinter,Python,Button,Tkinter,我试图在按下按钮时执行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(
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直到我释放按钮。您可以创建一个自定义的重复ttk按钮类,该类继承自ttk.button,但添加了基本的重复功能 试试这个。你可以像这样使用它
self.button = RepeatButton(master, text='Press', command=self.callback)
您可以设置repeatdelay和repeatinterval参数,默认值为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)
您可以创建一个自定义的重复ttk按钮类,该类继承自ttk.button,但添加了基本的重复功能 试试这个。你可以像这样使用它
self.button = RepeatButton(master, text='Press', command=self.callback)
您可以设置repeatdelay和repeatinterval参数,默认值为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)
您可以使用root.after重复安排作业以执行所需任务。请注意,我已将按钮事件更改为在按下按钮时激活,并在释放按钮时终止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()
您可以使用root.after重复安排作业以执行所需任务。请注意,我已将按钮事件更改为在按下按钮时激活,并在释放按钮时终止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()
你能修复代码块中的缩进吗?这对Python非常重要……缩进没有什么问题!现在我确实看得很清楚了-@mhawke修复了缩进。@Omera:是的,看看答案-旁边的答案特别好。你能修复代码块中的缩进吗?这对Python非常重要……缩进没有什么问题!现在我确实看得很清楚了-@mhawke修复了缩进。@Omera:是的,看看答案-旁边的答案特别好。@Rinzler:它在我的系统上是Tkinter,但在OP上是Tkinter,所以谢谢编辑。@Rinzler:它在我的系统上是Tkinter,但在OP上是Tkinter,所以谢谢编辑。这很好。方法与我的答案相同,但打包在一个可重用类+1中。@mhawke谢谢,你的也很好用。它可能比我的更加不言自明,这可能对OP更有用。我实际上也开始做类似的东西,但后来我发现这让我有了将它放到类中的想法。这很好。方法与我的答案相同,但打包在一个可重用类+1中。@mhawke谢谢,你的也很好用。它可能比我的更加不言自明,这可能对OP更有用。我实际上也开始做类似的东西,但后来我发现这给了我把它放在课堂上的想法。