【问题标题】:Radiobutton variable does not update单选按钮变量不更新
【发布时间】:2019-03-20 06:54:15
【问题描述】:

我知道有人问过类似的问题,我已经尝试了所有建议的方法来解决这个问题,但我无法解决这个问题。我正在制作一个文档,当按下单选按钮时,会出现第二个单选按钮,其中的选项会根据对第一个单选按钮的响应而有所不同。问题是在选择第一个单选按钮后没有任何反应,变量未设置为等于该值,如果我理解正确的话应该是这个值。我什至摆脱了创建按钮并添加辅助功能的循环命令行试图设置变量但没有运气......我开始认为这不能使用单选按钮来完成......有谁知道我是否遗漏了一些不允许设置变量的东西?

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()

【问题讨论】:

  • 请尝试将此代码缩减为minimal reproducible example。你能用一两个单选按钮而不是五个来说明这个问题吗?如果问题出在单选按钮上,您真的需要标签吗?
  • 至少部分问题是您在创建单选按钮后大约一毫秒调用var1.get()。用户将没有机会点击任何内容。
  • 我赞同布莱恩所说的。一个 MCVE 可能只有 10 行。在使用 tkinter 多年后,我仍然使用简单的最小程序来试验和调试问题。
  • 感谢批评,一定会牢记这一点!

标签: python tkinter radio-button


【解决方案1】:

根据我在您的代码中看到和测试的内容,在我看来,elif 并不像封装在单击单选按钮时调用的函数中。

为了测试这个理论,我在 showchoice 函数中加入了一个 print(var1.get()),它会在每次点击时打印出新的索引。因此,为了更进一步,我将 label4 创建行也移到了该函数中,它会正确更新表单。

所以在我看来,elif 块似乎需要封装到一个函数中,每次单击单选按钮时都会调用(并因此更新)该函数。

我希望这会有所帮助,或者至少能让您走上正确的道路。我看不出为什么单选按钮不能或不应该用于您正在做的事情!

~干杯!

【讨论】:

  • 啊哈,有道理,我要试一试,谢谢!
  • 我的荣幸,哈尔!祝你好运!
猜你喜欢
  • 2015-06-15
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 2016-01-30
  • 2017-09-11
  • 2012-05-04
  • 1970-01-01
  • 2018-06-12
相关资源
最近更新 更多