【问题标题】:Radiobutton in Tkinter calling functionTkinter 调用函数中的单选按钮
【发布时间】:2015-09-23 22:56:41
【问题描述】:

我在 tkinter 中有单选按钮的代码。我正在努力编写调用按钮命令的代码。基本上我希望用户能够选择一个时间范围和一个人。我有三个不同的文件,它们运行三种不同的数据分析,所以我希望这三个文件运行,但只从时间框架和那个人那里获取数据。

from Tkinter import *

class RBDemo:
    def __init__(self, win):
        self.v = IntVar()

        #Put the first group of radio buttons in their own frame.
        f1 = Frame(win, borderwidth=3, relief=RAISED)
        rb1 = Radiobutton(f1, text="This Week", variable=self.v, value=1)
        rb2 = Radiobutton(f1, text="This Month", variable=self.v, value=2)
        rb3 = Radiobutton(f1, text="This Year", variable=self.v, value=3)
        rb1.pack(anchor=W);  rb2.pack(anchor=W);   rb3.pack(anchor=W)
        f1.pack(side=LEFT)

        #Button one will be selected by default
        self.v.set(1)


        #Make a second group of radiobuttons in their own frame.
        #Make first button the default
        self.v2 = StringVar()
        f2 = Frame(win, borderwidth=2, relief=SOLID)

        rb4 = Radiobutton(f2, text="Bob", variable=self.v2, value="Bob")
        rb5 = Radiobutton(f2, text="Stacy", variable=self.v2, value="Stacy")
        rb6 = Radiobutton(f2, text="Both", variable=self.v2, value="Both") 
        rb4.pack(anchor=W);  rb5.pack(anchor=W); rb6.pack(anchor=W)
        f2.pack(side=RIGHT)
        self.v2.set("Bob")

        #Make a button that prints what each value is when clicked
        b = Button(win, text="Let's do this!", command=self.clicked)
        b.pack(side=BOTTOM, fill=BOTH, expand=1)


    def clicked(self):
        print("button clicked!")
        print("v is:", self.v.get())
        print("v2 is:", self.v2.get() )




mw = Tk()
app = RBDemo(mw)
mw.mainloop()

我试过了

    def selected(self):
    if self.my_var.get()==1:
        "do something"
        elif self.my_var.get()==2:
            "do something"
            else:
                "do something"

但这似乎不起作用,考虑到我必须使用按钮的输入运行三个文件,它也不是很pythonic。

【问题讨论】:

  • 一个简短的 if..elif..else 块完全符合 Python 风格(正确缩进时)。
  • 你的代码缩进不正确。
  • 您还应该将 self.my_var 替换为 self.v ...

标签: python button tkinter radio-button invoke


【解决方案1】:

首先,当正确缩进时,if - elif 块是完全可以的。所以你可以使用

if whatevervar.get() == 1:
    dosomethingfancy()
elif whatevervar.get() == 2:
    dosomethingcool()
#and so on

在其他语言中,有类似 switch - case 块的东西:wikipedia Python 中没有这样的结构,但有一个巧妙的小技巧有助于处理更大的代码块:

Options = {
         1: dosomething,
         2: dosomethingelse
}

#execution
Options[myvar.get()]()

基本上,定义了一个字典,将其键值映射到函数。注意括号:当定义字典时,您不想调用该函数。

【讨论】:

  • 我对不恰当的缩进感到很傻。谢谢。如果我使用 forloop,并且有 9 种按钮组合,我会有 9 个不同的 elif 部分吗? if self.v.get() == 1 & self.v.get() == Bob, elif self-v-get() == 1 & self.v.get()==Stacy,等等?跨度>
猜你喜欢
  • 2021-10-21
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
  • 1970-01-01
  • 2013-03-20
  • 2016-09-01
相关资源
最近更新 更多