Python 如何在tkinter中使用按键闪烁按钮?
我有一个tkinter按钮小部件,我想在按键时闪烁。该键绑定到根窗口。我尝试将按键绑定到按钮和根窗口,将按钮状态设置为ACTIVE,并将按钮takefocus设置为1,但按键按下时按钮不闪烁。按钮真的是为了显示,因为它没有被点击,但我希望它闪光无论如何Python 如何在tkinter中使用按键闪烁按钮?,python,tkinter,Python,Tkinter,我有一个tkinter按钮小部件,我想在按键时闪烁。该键绑定到根窗口。我尝试将按键绑定到按钮和根窗口,将按钮状态设置为ACTIVE,并将按钮takefocus设置为1,但按键按下时按钮不闪烁。按钮真的是为了显示,因为它没有被点击,但我希望它闪光无论如何 root = Tk() leftButton = Button(root, text="F", borderwidth=0) root.bind("<KeyPress-F>", buttonPress1) root.bind("<
root = Tk()
leftButton = Button(root, text="F", borderwidth=0)
root.bind("<KeyPress-F>", buttonPress1)
root.bind("<KeyPress-f>", buttonPress1)
leftButton.grid(row=3, column = 0)
leftButton.bind("<KeyPress-F>")
leftButton.bind("<KeyPress-f>")
leftButton.configure(state=ACTIVE)
leftButton.configure(takefocus=1)
root=Tk()
leftButton=按钮(根,text=“F”,边框宽度=0)
root.bind(“,按钮按1)
root.bind(“,按钮按1)
leftButton.grid(行=3,列=0)
leftButton.bind(“”)
leftButton.bind(“”)
leftButton.configure(状态=活动)
leftButton.configure(takefocus=1)
(明白了)我会通过在按键上按一个按钮来改变颜色,这样做的功能如下:
import tkinter as tk
r = tk.Tk()
l = tk.Label(text = 'press f to make button flash')
l.pack()
b = tk.Button(text = 'useless button')
b.config(bg = 'lightgrey')
b.pack()
def flash(event):
b.config(bg = 'yellow')
r.after(100, lambda: b.config(bg = 'lightgrey'))
r.bind("<KeyPress-f>", flash)
r.mainloop()
将tkinter作为tk导入
r=tk.tk()
l=tk.Label(文本='按f键使按钮闪烁')
l、 包()
b=tk.Button(文本=‘无用按钮’)
b、 配置(背景=‘浅灰色’)
b、 包()
def闪存(事件):
b、 配置(背景=‘黄色’)
r、 之后(100,lambda:b.config(bg='lightgrey'))
r、 绑定(“,flash)
r、 mainloop()
这使得按钮在十分之一秒的时间内变为黄色,这就像我能得到的闪光灯一样:)
我希望这对你有帮助
# TkButtonFLASH.py # execfile( "TkButtonFLASH.py" )
#
import Tkinter as tk
import tkMessageBox
class TestButtonFLASH():
def FlashStep1( self, anEvent ):
KeyHANDLER( anEvent ) # .DEBUG
if self.LOCK_STEP1: # .IF .LOCK_STEP1
return # .RET
'''
print "LOCK_STEP1: blocks further .bind() events ",
"from entering into an unfinished transaction ",
"state,\n still in waiting <state> ",
"before .after() finishes the started ",
"transaction & UNLOCKs LOCK_STEP1"
return # .RET after print
'''
self.LOCK_STEP1 = True # .SET .LOCK_STEP1
self.PUSH_POP = self.leftButton['bg'] # .PUSH current value in Class.attribute
self.leftButton['bg'] = 'yellow' # .SET
self.leftButton.after( 100, self.FlashStep2 ) # .SCHEDULE 100 [ms] self.FlashStep2()
self.leftButton.update() # .UPD GUI
def FlashStep2( self ):
self.leftButton['bg'] = self.PUSH_POP # .POP/.SET previous value from .attribute
self.LOCK_STEP1 = False # .SET !LOCK_STEP1
self.leftButton.update() # .UPD GUI
def ExitPROCESS( self ): # MVC-Controller-Part ..
if tkMessageBox.askokcancel( "Quit GUI", "Do you really wish to quit?" ):
self.master.destroy()
pass
def __init__( self, master ): # MVC-setup { Model + Visual + Controller }
# -------------------------------------------------------------- UI-state-var(s), not used so-far/anymore :)
self.PUSH_POP = ""
self.LOCK_STEP1 = False # .SET !LOCK_STEP1
# -------------------------------------------------------------- UI-construction ----------------------------------------------------------------
self.master = master
self.master.title( "Test TkButtonFLASH v0.0" ) # .title()
self.master.geometry( "400x400-50-50" ) # .geometry
#elf.master.iconbitmap() # .iconbitmap
self.master.protocol( 'WM_DELETE_WINDOW', self.ExitPROCESS ) # [X]-overide ---------------------------
self.master.lift() # raise window
self.leftButton = tk.Button( self.master, text = "F", borderwidth = 1, bg = "green" )
self.leftButton.grid( row = 0, column = 0 )
self.master.bind( "<KeyPress-F>", self.FlashStep1 )
self.master.bind( "<KeyPress-f>", self.FlashStep1 )
self.master.bind( "<KeyPress>", KeyHANDLER )
self.master.mainloop()
def KeyHANDLER( anEvent ): # .DEBUG utility
print "<Key>-event: ", anEvent.serial, anEvent.time, anEvent.char, anEvent.keysym, anEvent.keysym_num, str( anEvent.widget )
def main():
root = tk.Tk()
app = TestButtonFLASH( root )
if __name__ == '__main__':
main()
从原始的KeyHANDLER()
输出中可以看出,事件发生率的变化约为15-50[msec],比两步闪存事务的最短时间快得多,因此在第一个事务完成之前会出现更多的事务“启动”
因此,添加了一个基本的事务锁定以避免这种副作用。我不知道如何使按钮闪烁,但是(如果你这样做了?)将此过程放在一个名为buttonpress1的函数中,它应该可以工作。这段代码对我不起作用,代码形式W1ll1amvl也不起作用。按钮颜色没有变化。暂时改变按钮的颜色以模拟闪光灯是一个好主意,但我似乎无法在一般情况下改变颜色,即使在最初配置按钮时也是如此。@Steve有关于该观察的诊断吗?添加对类似于
def KeyHANDLER(anEvent:print)的自报告函数的调用可以帮助您深入到问题的根源。另外:您是在终端内部进行测试,还是通过空闲IDE进行测试?还有:在尝试.bind()
配置的处理程序之前,是否启动了root.mainloop()
<代码>
事件在进入root.mainloop()
之前不会出现在终端中,而鼠标事件与
一样会出现。我对这些诊断都不熟悉。我在终端内部运行它,.bind()
行出现在root.mainloop()
之前的代码中(如果这些行出现在root.mainloop()
之后,它们不起作用)@Steve Good,终端模式适合Tkinter原型设计,比基于Tk的空闲“更干净”(并发Tk内部可能会发生冲突)。将修改代码,以使KeyHANDLER()自我报告到位。谢谢,我不明白您关于KeyHANDLER函数的意思。当您运行该程序并按F键时,按钮是否闪烁?这对我来说不是,这是我得到的控制台输出:-事件:907 1677850096 F 70'-事件:915 1677850384 F 70-事件:923 1677850631 F 70-事件:931 1677851136 F 70-事件:939 1677851637 F 70-事件:943 1677851721 F 70-事件:947 1677851806 F 70-事件:9511677851890f70-事件:955 1677851974 F 70。
<Key>-event: 1240 323533265 s s 115 .
<Key>-event: 1241 323533296 s s 115 .
<Key>-event: 1242 323533343 s s 115 .
<Key>-event: 1243 323533375 s s 115 .
<Key>-event: 1244 323533390 s s 115 .
<Key>-event: 1245 323533437 s s 115 .
<Key>-event: 1246 323533468 s s 115 .
<Key>-event: 1247 323533500 s s 115 .
<Key>-event: 1248 323533515 s s 115 .
<Key>-event: 1249 323533562 s s 115 .