Python 如何在tkinter中使用按键闪烁按钮?

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("<

我有一个tkinter按钮小部件,我想在按键时闪烁。该键绑定到根窗口。我尝试将按键绑定到按钮和根窗口,将按钮状态设置为ACTIVE,并将按钮takefocus设置为1,但按键按下时按钮不闪烁。按钮真的是为了显示,因为它没有被点击,但我希望它闪光无论如何

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 .