【问题标题】:How can I remove the effect of the first Radiobutton when selecting different Radiobutton?选择不同的 Radiobutton 时如何删除第一个 Radiobutton 的效果?
【发布时间】:2022-01-05 05:40:06
【问题描述】:

我想为我的代码组织 GUI,它有 2 个部分。我通过添加Radiobutton s组织它,其中选择一个时,它仅显示“第1节”。而当另一个Radiobutton被选中时,它应该不显示“Section 1”,而只显示“Section 2”。

这就是想法,一切顺利,除了如果我更改Radiobutton 选择,它会显示两个部分。

如何让它一次只显示一个?

这是一个可以运行的示例代码:

from tkinter import *

def main():
    root = Tk()
    app = Window(root)
    root.mainloop()


class Window():
    def __init__(self, master):
        self.master=master
        self.master.title("Test")
        self.master.geometry('1000x700')

        self.Radio=Label (self.master, text="Select Method", bg='Lavender')
        self.RadioFrame=LabelFrame(self.master, width=230, height=150, labelwidget=self.Radio, bg='lavender')
        self.RadioFrame.place(x=200, y=35)

        selection = IntVar()
        selection.set(0)
        r1 = Radiobutton(self.RadioFrame, text="Option 1", variable=selection, value=1, command=lambda: Clicked(selection.get()), bg='lavender').pack()
        r2 = Radiobutton(self.RadioFrame, text="Option 2", variable=selection, value=2, command=lambda: Clicked(selection.get()), bg='lavender').pack()

        def Clicked(variable):

            if selection.get() ==1:
                self.label_1=Label (self.master, text="label 1", bg='lavender')
                self.label_1Frame=LabelFrame(self.master, width=230, height=90, labelwidget= self.label_1, bg='lavender')
                self.label_1Frame.place(x=490, y=35)

            elif selection.get() ==2:
                self.label_2=Label (self.master, text="label_2", bg='lavender')
                self.label_2Frame=LabelFrame(self.master, width=230, height=60, labelwidget= self.label_2, bg='lavender')
                self.label_2Frame.place(x=490, y=340)

#root.mainloop()
if __name__=='__main__':
    main()

【问题讨论】:

标签: python tkinter radio-button


【解决方案1】:

单击单选按钮时,您创建了新的LabelFrame。您应该先创建两个标签框而不显示它们,然后根据单选按钮的选择显示一个:

class Window():
    def __init__(self, master):
        self.master=master
        self.master.title("Test")
        self.master.geometry('1000x700')

        self.Radio=Label (self.master, text="Select Method", bg='Lavender')
        self.RadioFrame=LabelFrame(self.master, width=230, height=150, labelwidget=self.Radio, bg='lavender')
        self.RadioFrame.place(x=200, y=35)

        selection = IntVar()
        selection.set(0)
        r1 = Radiobutton(self.RadioFrame, text="Option 1", variable=selection, value=1, command=lambda: Clicked(selection.get()), bg='lavender').pack()
        r2 = Radiobutton(self.RadioFrame, text="Option 2", variable=selection, value=2, command=lambda: Clicked(selection.get()), bg='lavender').pack()

        # create the two label frames without showing them
        self.label_1=Label (self.master, text="label 1", bg='lavender')
        self.label_1Frame=LabelFrame(self.master, width=230, height=90, labelwidget= self.label_1, bg='lavender')

        self.label_2=Label (self.master, text="label_2", bg='lavender')
        self.label_2Frame=LabelFrame(self.master, width=230, height=60, labelwidget= self.label_2, bg='lavender')

        def Clicked(selected):

            if selected ==1:
                self.label_1Frame.place(x=490, y=35) # show label frame 1
                self.label_2Frame.place_forget() # hide label frame 2

            elif selected ==2:
                self.label_1Frame.place_forget() # hide label frame 1
                self.label_2Frame.place(x=490, y=340) # show label frame 2

【讨论】:

  • 谢谢你,真的很感谢你的时间:)
【解决方案2】:

你可以这样使用:

try:
    self.any_widget.destroy()
except AttributeError:
    pass

销毁任何小部件。
所以,我已经更正了你的代码:

from tkinter import *  

def main():    
    root = Tk()
    app = Window(root)
    root.mainloop()


class Window():
    def __init__(self, master):
        self.master=master
        self.master.title("Test")
        self.master.geometry('1000x700')

        self.Radio=Label (self.master, text="Select Method", bg='Lavender')
        self.RadioFrame=LabelFrame(self.master, width=230, height=150, labelwidget=self.Radio, bg='lavender')
        self.RadioFrame.place(x=200, y=35)

        selection = IntVar()
        selection.set(0)
        r1 = Radiobutton(self.RadioFrame, text="Option 1", variable=selection, value=1, command=lambda: Clicked(selection.get()), bg='lavender').pack()
        r2 = Radiobutton(self.RadioFrame, text="Option 2", variable=selection, value=2, command=lambda: Clicked(selection.get()), bg='lavender').pack()

        def Clicked(variable):
    
            if selection.get() ==1: 
                self.label_1=Label (self.master, text="label 1", bg='lavender')
                self.label_1Frame=LabelFrame(self.master, width=230, height=90, labelwidget= self.label_1, bg='lavender')
                self.label_1Frame.place(x=490, y=35)
                try:
                    self.label_2Frame.destroy()
                except AttributeError:
                    pass

            elif selection.get() ==2:
                self.label_2=Label (self.master, text="label_2", bg='lavender')
                self.label_2Frame=LabelFrame(self.master, width=230, height=60, labelwidget= self.label_2, bg='lavender')
                self.label_2Frame.place(x=490, y=340)
                try:
                    self.label_1Frame.destroy()
                except AttributeError:
                    pass

#root.mainloop()
if __name__=='__main__':
    main()

试试这个。

【讨论】:

  • user17356493:多次重复创建和销毁基本相同的小部件有点浪费(也是不必要的),这是在部分之间来回切换时使用这种方法会发生的情况. IMO 在@acw1668 的answer 中完成的方式是处理此类事情的更好方式。
  • 是的,我也这么认为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
  • 2017-02-15
  • 1970-01-01
相关资源
最近更新 更多