Переменная радиобутона не обновляется

1

Я знаю, что задан вопрос, подобный этому, и я попробовал все, что было предложено для решения проблемы, но я не могу решить эту проблему. Я делаю документ, что при нажатии радиообъекта появляется вторая радиобарабана, у которой есть варианты, которые будут меняться в зависимости от реакции на первый радиоблок. Проблема в том, что ничего не происходит после того, как выбрана первая радиообъектка, переменная не установлена равной значению, которое должно быть, если я правильно понимаю. Я даже избавился от своих циклов, которые создали кнопки, и добавили вторичную функцию в командной строки в попытке установить переменную, но не повезло... Я начинаю думать, что это невозможно сделать с помощью радиолюбителей... Кто-нибудь знает, если мне не хватает чего-то, что не позволяет установить переменную?

from tkinter import Tk, Label, IntVar, Radiobutton

class pricingDoc:

    def __init__(self, master):
        self.master = master
        master.title("Dyna-Vac Equipment Pricing GUI")

        models = ["DJ5.636", "DJ1225", "DJ2040", "DJ4020", "DJ4030", "DJ6520"]
        model_prices = [8139.00, 23770.00, 48050.00, 48040.00, 48030.00, 66050.0]
        reels = ["""3/8" x 150'""", """1/2" x 300'""", """1/2" x 500'""", """3/4" x 600'""",
                 """3/4" x 800'""", """1" x 600'""", """1" x 800'"""]
        reel_prices = [0.00, 0.00, 850.00, 0.00, 1050.00, 0.00, 850.00]

        self.label1 = Label(master, text="Jet Trailer Model")
        self.label1.grid(row=1, column=1)
        self.label2 = Label(master, text="Price, in USD")
        self.label2.grid(row=1, column=3)

        def showchoice(var1, updateint):
            var1.set(updateint)

        var1 = IntVar(master)

        row_counter = 2
        self.modelbutton = Radiobutton(master, text=models[0], variable=var1, value=0, indicatoron=False,
                                           activebackground="green", width=12, command=lambda: showchoice(var1, 0))
        self.modelbutton.grid(row=row_counter, column=1)
        row_counter += 1
        self.modelbutton = Radiobutton(master, text=models[1], variable=var1, value=1, indicatoron=False,
                                         activebackground="green", width=12, command=lambda: showchoice(var1, 1))
        self.modelbutton.grid(row=row_counter, column=1)
        row_counter += 1
        self.modelbutton = Radiobutton(master, text=models[2], variable=var1, value=2, indicatoron=False,
                                         activebackground="green", width=12, command=lambda: showchoice(var1, 2))
        self.modelbutton.grid(row=row_counter, column=1)
        row_counter += 1
        self.modelbutton = Radiobutton(master, text=models[3], variable=var1, value=3, indicatoron=False,
                                         activebackground="green", width=12, command=lambda: showchoice(var1, 3))
        self.modelbutton.grid(row=row_counter, column=1)
        row_counter += 1
        self.modelbutton = Radiobutton(master, text=models[4], variable=var1, value=4, indicatoron=False,
                                         activebackground="green", width=12, command=lambda: showchoice(var1, 4))
        self.modelbutton.grid(row=row_counter, column=1)
        row_counter += 1
        self.modelbutton = Radiobutton(master, text=models[5], variable=var1, value=5, indicatoron=False,
                                         activebackground="green", width=12, command=lambda: showchoice(var1, 5))
        self.modelbutton.grid(row=row_counter, column=1)

        row_counter = 2

        for price in model_prices:
            self.label3 = Label(master, text=price)
            self.label3.grid(row=row_counter, column=3)
            row_counter += 1

        self.label4 = Label(master, text="model {} is chosen".format(var1.get()))
        self.label4.grid(row=row_counter, column=1)
        row_counter += 1

        self.label5 = Label(master, text="Reel Size Selection")
        self.label5.grid(row=row_counter, column=1)
        row_counter += 1

        var2 = IntVar(master)

        if var1.get() == 0:
            self.reelbutton = Radiobutton(master, text=reels[0], variable=var2, value=0, indicatoron=False,
                                                activebackground="green", width=12)
            self.reelbutton.grid(row=row_counter, column=1)
            row_counter += 1
            row_counter = 10
            self.label6 = Label(master, text=reel_prices[0])
            self.label6.grid(row=row_counter, column=3)

        elif 1 <= var1.get() <= 2:
            self.reelbutton = Radiobutton(master, text=reels[1], variable=var2, value=1, indicatoron=False,
                                                activebackground="green", width=12)
            self.reelbutton.grid(row=row_counter, column=1)
            self.label6 = Label(master, text=reel_prices[1])
            self.label6.grid(row=row_counter, column=3)
            row_counter += 1
            self.reelbutton = Radiobutton(master, text=reels[2], variable=var2, value=2, indicatoron=False,
                                            activebackground="green", width=12)
            self.reelbutton.grid(row=row_counter, column=1)
            self.label7 = Label(master, text=reel_prices[2])
            self.label7.grid(row=row_counter, column=3)
            row_counter += 1

        elif 3 <= var1.get() <= 4:
            self.reelbutton = Radiobutton(master, text=reels[3], variable=var2, value=3, indicatoron=False,
                                                activebackground="green", width=12)
            self.reelbutton.grid(row=row_counter, column=1)
            self.label6 = Label(master, text=reel_prices[3])
            self.label6.grid(row=row_counter, column=3)
            row_counter += 1
            self.reelbutton = Radiobutton(master, text=reels[4], variable=var2, value=4, indicatoron=False,
                                            activebackground="green", width=12)
            self.reelbutton.grid(row=row_counter, column=1)
            self.label7 = Label(master, text=reel_prices[4])
            self.label7.grid(row=row_counter, column=3)
            row_counter += 1

        elif var1.get() == 5:
            self.reelbutton = Radiobutton(master, text=reels[5], variable=var2, value=5, indicatoron=False,
                                                activebackground="green", width=12)
            self.reelbutton.grid(row=row_counter, column=1)
            self.label6 = Label(master, text=reel_prices[5])
            self.label6.grid(row=row_counter, column=3)
            row_counter += 1
            self.reelbutton = Radiobutton(master, text=reels[6], variable=var2, value=6, indicatoron=False,
                                            activebackground="green", width=12)
            self.reelbutton.grid(row=row_counter, column=1)
            self.label7 = Label(master, text=reel_prices[6])
            self.label7.grid(row=row_counter, column=3)
            row_counter += 1

        row_counter += 1
        self.label8 = Label(master, text="Total unit price as built: {}".format(model_prices[var1.get()] +
                                                                                reel_prices[var2.get()]))
        self.label8.grid(row=row_counter, column=3)
        row_counter += 1





root = Tk()
my_gui = pricingDoc(root)
root.mainloop()
  • 1
    Пожалуйста, постарайтесь сократить этот код до минимального воспроизводимого примера . Можете ли вы проиллюстрировать проблему с помощью одной или двух радиокнопок вместо пяти? Вы действительно нуждаетесь в этикетках, если проблема с Radiobutton?
  • 1
    По крайней мере, часть проблемы в том, что вы вызываете var1.get() примерно через миллисекунду после создания радиокнопки. У пользователя не будет возможности нажать на что-либо.
Показать ещё 2 комментария
Теги:
tkinter
radio-button

1 ответ

0
Лучший ответ

Из того, что я вижу и тестировал в вашем коде, это не выглядит так, как elifs инкапсулируются в функцию, вызываемую при нажатии переключателя.

Чтобы проверить эту теорию, я бросил print (var1.get()) в функцию showchoice и распечатывал новый индекс при каждом нажатии. Поэтому, чтобы принять это, я переместил строки создания метки4 в эту функцию, а также правильно обновил форму.

Поэтому мне кажется, что блок elifs должен быть инкапсулирован в функцию, которая называется (и, следовательно, обновляется) каждый раз при нажатии переключателей.

Надеюсь, это поможет или, по крайней мере, поставит вас на правильный путь. Я не вижу причин, почему радиокнопки не могли или не должны использоваться для того, что вы делаете!

~ Ура!

  • 0
    аааа, имеет смысл, я собираюсь попробовать, спасибо!
  • 0
    С удовольствием, Хэл! Удачи!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню