【问题标题】:how to make multiple tkinter buttons to press together while as user presses any one of them?当用户按下其中任何一个时,如何使多个 tkinter 按钮一起按下?
【发布时间】:2021-10-04 17:37:24
【问题描述】:

当用户按下其中任何一个时,如何让多个 tkinter 按钮同时按下?

要清楚,我希望多个 tkinter 按钮看起来像用户同时按下其中任何一个按钮。

我试过这个:

from tkinter import *
from tkinter import ttk

class one_for_all:
    def __init__(self):
        self.root = Tk()
        self.root.title("One For All, All For One")

        self.frame = ttk.Frame(self.root, padding="3 3 12 12")
        self.frame.grid(row=0, column=0)
        self.root.rowconfigure(0, weight=1)
        self.root.columnconfigure(0, weight=1)
        
        self.btn1 = ttk.Button(self.frame, text="btn1", command=lambda : self.push_all(1))
        self.btn2 = ttk.Button(self.frame, text="btn2", command=lambda : self.push_all(2))
        self.btn3 = ttk.Button(self.frame, text="btn3", command=lambda : self.push_all(3))
        self.btn4 = ttk.Button(self.frame, text="btn4", command=lambda : self.push_all(4))


        self.btn1.grid(row=0, column=0, sticky="nsew")
        self.btn2.grid(row=0, column=1, sticky="nsew")
        self.btn3.grid(row=1, column=0, sticky="nsew")
        self.btn4.grid(row=1, column=1, sticky="nsew")

        for child in self.frame.winfo_children():
            child.grid_configure(padx=5, pady=5)

    def push_all(self, caller):
        if caller != 1:
            self.btn1.configure(command=lambda : None)
            self.btn1.event_generate("<ButtonPress-1>")
            self.btn1.event_generate("<ButtonRelease-1>")
            self.btn1.configure(command=lambda: self.push_all(1))
        if caller != 2:
            self.btn2.configure(command=lambda : None)
            self.btn2.event_generate("<ButtonPress-1>")
            self.btn2.event_generate("<ButtonRelease-1>")
            self.btn2.configure(command=lambda: self.push_all(2))
        if caller != 3:
            self.btn3.configure(command=lambda : None)
            self.btn3.event_generate("<ButtonPress-1>")
            self.btn3.event_generate("<ButtonRelease-1>")
            self.btn3.configure(command=lambda: self.push_all(3))
        if caller != 4:
            self.btn4.configure(command=lambda : None)
            self.btn4.event_generate("<ButtonPress-1>")
            self.btn4.event_generate("<ButtonRelease-1>")
            self.btn4.configure(command=lambda: self.push_all(4))

    def mainloop(self):
        self.root.mainloop()

if __name__ == "__main__":
    one_for_all().mainloop()


但看起来只有按钮 4 受到其他按钮的刺激,而不是全部 4 :( 注意:我刚刚启动 tkinter,没有任何 GUI 经验

提前致谢。

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    你可以这样做:

    from tkinter import Tk, Button
    
    
    class MainWindow(Tk):
        def __init__(self):
            super().__init__()
    
            self.buttons = list()
            for i in range(4):
                button = Button(self, text=f'Button {i}')
                button.bind('<ButtonPress-1>', self.press)
                button.bind('<ButtonRelease-1>', self.release)
                button.pack(fill='both')
                self.buttons.append(button)
    
        def press(self, event=None):
            for btn in self.buttons:
                btn.config(relief='sunken')
    
        def release(self, event=None):
            for btn in self.buttons:
                btn.config(relief='raised')
    
    
    if __name__ == '__main__':
        MainWindow().mainloop()
    

    它会在视觉上使它们看起来像被点击一次。

    您可以简单地从Tk 继承,它会减少编写的代码,因为而不是self.root,它只是self,并且功能将被继承,其他东西,例如,不要需要定义mainloop,因为它已经被继承了。

    还有:
    我强烈建议关注PEP 8 - Style Guide for Python Code。函数和变量名应该在snake_case,类名在CapitalCase。在函数和类声明周围有两个空行。

    我强烈建议您在导入某些内容时不要使用通配符 (*),您应该导入您需要的内容,例如from module import Class1, func_1, var_2 等等或导入整个模块:import module 然后你也可以使用别名:import module as md 或类似的东西,关键是不要导入所有内容,除非你真的知道你在做什么;名称冲突是问题所在。

    【讨论】:

    • 感谢您的帮助和建议,我一定会听从您的建议和 PEP 8
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 2020-11-30
    • 2014-06-14
    相关资源
    最近更新 更多