Tho*_*mas 6 python bind tkinter button
我将事件绑定<Return>到一个Button,认为这会导致command在命中之后运行Enter:
Button(self.f, text="Print", command=self.Printer).pack(side=RIGHT, padx=10, pady=10)
self.button1 = Button(self.f, text="search", command=self.search)
self.button1.bind('<Return>', self.search)
self.button1.pack(side=RIGHT, padx=10, pady=10)
Run Code Online (Sandbox Code Playgroud)
但它没有做任何事情.按下self.search时我必须做什么才能运行Enter?
unu*_*tbu 13
您的代码看起来很好,但请注意,如果要Return调用,焦点必须在按钮上self.search().您可以按下将焦点从小部件更改为小部件Tab.焦点小部件用黑色细线勾勒出轮廓.Tab在按下之前,您可能需要按一次或多次才能将焦点移至按钮Return.
如果要Return在GUI窗口中的任何位置工作,请进行更改
self.button1.bind('<Return>', self.search)
Run Code Online (Sandbox Code Playgroud)
至
root.bind('<Return>', self.search)
Run Code Online (Sandbox Code Playgroud)
哪里root = tk.Tk().
例如,button.bind与master.bind下面的代码进行比较:
import Tkinter as tk
class SimpleApp(object):
def __init__(self, master, **kwargs):
title = kwargs.pop('title')
frame = tk.Frame(master, **kwargs)
frame.grid()
button = tk.Button(frame, text = 'search', command = self.search)
button.grid()
button.bind('<Return>', self.search)
# uncomment if you want `<Return>` bound everywhere.
# master.bind('<Return>', self.search)
def search(self,*args):
print('searching...')
def basic():
root = tk.Tk()
app = SimpleApp(root, title = 'Hello, world')
root.mainloop()
basic()
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用
button.bind('<Return>', self.search)
button.focus()
Run Code Online (Sandbox Code Playgroud)
这样做,只有当按钮具有焦点时才按下Return调用self.search(),但是当应用程序开始时按钮会获得焦点.
关于使用*args和**kwargs:
**kwargs允许传递任意关键字参数__init__.
何时**kwargs在函数定义中使用如下:
def __init__(self, master, **kwargs):
Run Code Online (Sandbox Code Playgroud)
我们实例化SimpleApp如下:
app = SimpleApp(root, title = 'Hello, world')
Run Code Online (Sandbox Code Playgroud)
然后Python设置kwargs为包含关键字参数的dict,例如{'title':'Hello, world'}.请注意,**kwargsPython语法只能用于函数定义和函数调用(见下文),但kwargs本身只是一个字典.
kwargs然后传递给Frame:
frame = tk.Frame(master, **kwargs)
Run Code Online (Sandbox Code Playgroud)
现在,当在函数调用中使用**kwargs时,kwargsdict中的键值对被扩展,以便上面的函数调用等效于
frame = tk.Frame(master, title = 'Hello, world')
Run Code Online (Sandbox Code Playgroud)
由于Frame可以采用大量关键字参数,并且我不完全了解它们并且不希望枚举它们,因此使用它是有利的**kwargs.另请注意,即使Frame稍后添加了新的关键字参数,我的代码仍然可以正常工作,而如果我明确地拼写出关键字,那么如果Frame允许的关键字发生变化,我的代码就不会自动"升级" .
*args同样,允许您包含任意位置参数search:
def search(self,*args):
Run Code Online (Sandbox Code Playgroud)
Python的设定args包含所有发送到位置参数列表search时search被调用.
我在这里使用*args因为self.search没有参数或一个参数调用.
当你说
button = tk.Button(frame, text = 'search', command = self.search)
Run Code Online (Sandbox Code Playgroud)
self.search()单击按钮时调用没有任何参数.但是当你说的时候
button.bind('<Return>', self.search)
Run Code Online (Sandbox Code Playgroud)
self.search(event)Return按下键时调用一个参数.event是一个Tkinter.Event,它具有属性(时间,状态,类型,小部件,x,y等),可以让您更多地了解发生了什么事件.
另一种可能更好的定义方式search是
def search(self, event = None):
...
Run Code Online (Sandbox Code Playgroud)
这可以说明search可以传递0或1个参数,而不是简单和任意数量的参数.event如果事件传递给它,它也可以更容易地访问search.
参考:
| 归档时间: |
|
| 查看次数: |
15869 次 |
| 最近记录: |