0

为什么我的 Tkinter 绑定按钮无法正常工作?当我用鼠标点击开始按钮时,关于按钮会改变! 显示图像

这是我的代码:

import tkinter as tk


class Panel(tk.Tk):

    def __init__(self):
        super().__init__()

        # window config
        self.title('test')
        self.geometry('300x300')
        self.configure(bg='#2b2e37')
 
   
    def btns(self, x, y, text, bg, fg):
        def on_enter(ctx):
            self.btn['background'] = fg
            self.btn['foreground'] = bg
        def on_leave(ctx):
            self.btn['background'] = bg
            self.btn['foreground'] = fg

        
        self.btn = tk.Button(self, text=text, bg=bg, fg=fg, activebackground=fg, activeforeground=bg, border=0, width=42, height=2)
        self.btn.bind('<Enter>', on_enter)
        self.btn.bind('<Leave>', on_leave)
        self.btn.place(x=x, y=y)
        

if __name__ == '__main__':
    window = Panel()
    window.btns(0, 190, 'S T A R T', '#2b2e37', '#56fc03')
    window.btns(0, 230, 'A B O U T', '#2b2e37', '#f5ec42')
    window.mainloop()

我认为这是为了我的 oop 代码,我写的很简单并且工作正常。对不起,我的英语不好

4

2 回答 2

1

ctx发生事件的按钮被传递给属性中参数中的事件处理程序widget,因此您可以使用它来代替self.btn

    def btns(self, x, y, text, bg, fg):
        def on_enter(ctx):
            ctx.widget['background'] = fg
            ctx.widget['foreground'] = bg
        def on_leave(ctx):
            ctx.widget['background'] = bg
            ctx.widget['foreground'] = fg

在这些事件处理程序中使用self.btnin place 的问题是,您第二次调用,被第二个按钮替换,因此您添加到第一个按钮的事件处理程序最终会更改第二个按钮。ctx.widgetbtnsself.btn

于 2022-02-20T11:08:01.917 回答
0

我通过为每个按钮单独编写来修复我的代码。

新代码:

    def btns(self):
        def on_enter1(ctx):
            self.btn1['background'] = '#56fc03'
            self.btn1['foreground'] = '#2b2e37'
        def on_leave1(ctx):
            self.btn1['background'] = '#2b2e37'
            self.btn1['foreground'] = '#56fc03'
        def on_enter2(ctx):
            self.btn2['background'] = '#f5ec42'
            self.btn2['foreground'] = '#2b2e37'
        def on_leave2(ctx):
            self.btn2['background'] = '#2b2e37'
            self.btn2['foreground'] = '#f5ec42'

        
        self.btn1 = tk.Button(self, text='S T A R T', bg='#2b2e37', fg='#56fc03', activebackground='#56fc03', activeforeground='#2b2e37', border=0, width=42, height=2)
        self.btn2 = tk.Button(self, text='A B O U T', bg='#2b2e37', fg='#f5ec42', activebackground='#f5ec42', activeforeground='#2b2e37', border=0, width=42, height=2)
        self.btn1.bind('<Enter>', on_enter1)
        self.btn1.bind('<Leave>', on_leave1)
        self.btn2.bind('<Enter>', on_enter2)
        self.btn2.bind('<Leave>', on_leave2)
        self.btn1.place(x=0, y=190)
        self.btn2.place(x=0, y=230)

if __name__ == '__main__':
    window = Panel()
    window.label()
    window.btns()
    window.mainloop()
于 2022-02-20T07:07:47.993 回答