Невозможно вызвать Radiobutton в Tkinter при использовании .grid - PullRequest
1 голос
/ 20 февраля 2020

Я пытаюсь создать группу радиокнопок в tkinter и не могу вызвать их после создания. Когда я использую .pack (), кнопки могут вызываться, но когда используется .grid, кнопки не могут быть вызваны.

def initialize():
    Label(window,text = "Customer Name").grid(column = 0, row = 0)
    customerName = StringVar()
    nameEntry = Entry(window,textvariable = customerName)
    nameEntry.grid(column = 1, row = 0)
    def firstPizza():
        Label(window,text = "Pizza 1").grid(column = 0,row = 1)
        pizzaCost = DoubleVar() #12 and 10
        largeButton = Radiobutton(window,text = "Large $15.95",value = 15.95,variable = pizzaCost)
        mediumButton = Radiobutton(window,text = "Medium $12.95",value = 12.95, variable = pizzaCost)
        smallButton = Radiobutton(window,text = "Small $10.95",value = 10.95, variable = pizzaCost)
        largeButton.grid(column = 0,row = 2)
        largeButton.invoke()
        mediumButton.grid(column = 1, row = 2)
        smallButton.grid(column = 2, row = 2)


    firstPizza()

Эта строка largeButton.invoke () не выполняет своего предназначения и вообще ничего не вызывается.

1 Ответ

1 голос
/ 20 февраля 2020

Проблема в том, что pizzaCost является локальной переменной. Вызов работает, но затем переменная получает сборщик мусора, а значение выбрасывается.

Если вы сделаете переменную глобальной, вызов invoke будет работать. Учитывая, что вы, вероятно, захотите получить доступ к значению позже, вам все равно придется сделать его глобальным, поскольку вы не используете классы.

В следующем примере обратите внимание, как pizzaCost определяется как глобальный внутри firstPizza.

from tkinter import *
def initialize():
    Label(window,text = "Customer Name").grid(column = 0, row = 0)
    customerName = StringVar()
    nameEntry = Entry(window,textvariable = customerName)
    nameEntry.grid(column = 1, row = 0)
    def firstPizza():
        global pizzaCost
        Label(window,text = "Pizza 1").grid(column = 0,row = 1)
        pizzaCost = DoubleVar() #12 and 10
        largeButton = Radiobutton(window,text = "Large $15.95",value = 15.95,variable = pizzaCost)
        mediumButton = Radiobutton(window,text = "Medium $12.95",value = 12.95, variable = pizzaCost)
        smallButton = Radiobutton(window,text = "Small $10.95",value = 10.95, variable = pizzaCost)
        largeButton.grid(column = 0,row = 2)
        largeButton.invoke()
        mediumButton.grid(column = 1, row = 2)
        smallButton.grid(column = 2, row = 2)


    firstPizza()

window = Tk()
initialize()
window.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...