如何在tkinter中禁用和销毁多个按钮?

时间:2020-09-02 17:34:00

标签: python tkinter

此刻我面临两个问题。

  1. 当我单击“麦克”按钮和所有麦克的子按钮时,我希望上一行按钮被禁用,而不是“萨拉”按钮

  2. 当我单击“ Sara”按钮时,我希望Mike的子按钮被破坏并恢复到原始状态。

我很难全神贯注于该功能。我觉得自己走的路很长。任何帮助将不胜感激!

import tkinter as tk
app = tk.Tk()
app.geometry("300x300")

def buttonA1State():
        if (buttonA1['state'] == tk.NORMAL):
            buttonA1['state'] = tk.DISABLED
        else:
            buttonA1['state'] = tk.NORMAL

def btn3():
    buttonA2 = tk.Button(app, text="Button A2",command = lambda:[buttonA1State(), btn5()])
    buttonA2.grid(padx=10, pady=10, row=2, column=1)
    buttonA3 = tk.Button(app, text="Button A3",command=btn4)
    buttonA3.grid(padx=10, pady=10, row=2, column=2)

def btn4():
    buttonA4 = tk.Button(app, text="Button A4")
    buttonA4.grid(padx=10, pady=10, row=3, column=2)

def btn5():
    buttonA5 = tk.Button(app, text="Button A5")
    buttonA5.grid(padx=10, pady=10, row=3, column=1)   

buttonA1 = tk.Button(app, text="Mike", command = lambda:[buttonA1State(), btn3()])
buttonA1.grid(padx=10, pady=10, row=1, column=1)
buttonB1 = tk.Button(app, text="Sara", command = btn3 )
buttonB1.grid(padx=10, pady=10, row=1, column=2)
app.mainloop()

1 个答案:

答案 0 :(得分:1)

  1. 您说要禁用到上一行,但是无法识别行中有哪些按钮。您需要找到一种逻辑方法来处理您的按钮,最好避免在操作具有相似性时按原样对每个按钮进行硬编码。如果列表编号与网格位置相关联,则可以创建按钮数组。
names = [["Mike", "Sara"]]
buttons = []
for x in range(names):
    buttons.append()
    for y in range(names[x]):
        buttons[x].append(Button(app, text=names[x][y])))

上面的代码将允许您使用易于理解的矩阵来引用按钮,自从在第1行启动按钮以来,您必须稍作调整,但这很容易做到。您需要一个全局值来跟上活动的行和列。

  1. 您应该首先创建所有可能的按钮,然后使用grid()和grid_forget()方法更改要显示的按钮。您可能需要在列表中组织按钮(与Mike或Sara相关)以帮助处理它们。如果您希望程序易于扩展,并且Mike和Sara的按钮是相似的按钮,那么您可能想创建一个类。
class APerson:
    def __init__(self, window, name):
        self.name = name
        self.selected = False
        self.select_button = Button(window, text=self.name command=select)
        self.secondary_button = Button(window, text="Secondary")
        self.another_button = Button(window, text="More Buttons")

    def toggle_select(self):
        self.selected = not self.selected


mike = APerson(app, "Mike")
sara = APerson(app, "Sara")


def main_callback:
    if mike.selected:
    etc...

app.after(1000, main_callback)

这些是摘要,您可能会发现有帮助。一般而言,有很多方法可以在python和程序设计中进行操作,因此您确实必须选择最能解决您要解决的问题的方法。您可能更喜欢创建传递按钮的行对象,而不是创建具有按钮的人员对象。我会避免对每个动作进行硬编码,尤其是在您需要程序完全扩展的情况下。