Python 基于单选按钮应答更改帧

Python 基于单选按钮应答更改帧,python,tkinter,Python,Tkinter,我正在尝试一个简单的实验,我有3个框架,框架1有两个标签-“对于第2页”和“对于第3页”,它还有两个单选按钮对应于标签。根据选择的单选按钮,当用户点击下一页按钮时,我希望该按钮将用户带到所选页面 这是密码- import Tkinter as tk class MainApp(tk.Tk): def __init__(self, *args, **kwargs): tk.Tk.__init__(self, *args, **kwargs) # th

我正在尝试一个简单的实验,我有3个框架,框架1有两个标签-“对于第2页”和“对于第3页”,它还有两个单选按钮对应于标签。根据选择的单选按钮,当用户点击下一页按钮时,我希望该按钮将用户带到所选页面

这是密码-

import Tkinter as tk

class MainApp(tk.Tk):

    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)

        # the main container that holds all the frames
        container = tk.Frame(self)

        container.pack(side = "top", fill = "both", expand = True)
        container.grid_rowconfigure(0, weight = 1)
        container.grid_columnconfigure(0,weight = 1)


        self.frames = {}

        # adding frames to the dictionary
        for F in (Page1,Page2,Page3):

             frame = F(container,self)

             self.frames[F] = frame

             frame.grid(row = 0, column = 0, sticky = "w")

        self.show_frame(Page1)

    def show_frame(self,page_name):

        #SHOWS A FRAME WITH THE GIVEN NAME
        for frame in self.frames.values():
            frame.grid_remove()
        frame = self.frames[page_name]
        frame.grid()

    #STACKING THE FRAMES
    #frame = self.frames[cont]
    #frame.tkraise()

class Page1(tk.Frame):
    def __init__(self,parent,controller):
        tk.Frame.__init__(self,parent)

        lbl1 = tk.Label(self,text = "for page 2",font =("Helvetica",12,"bold"))
        lbl1.grid(row=1,sticky="W")

        lbl2 = tk.Label(self,text = "for page 3",font =("Helvetica",12,"bold"))
        lbl2.grid(row=1,column=1,sticky="W")

        btn1 = tk.Button(self, text="next page", font=('MS', 24, 'bold'))
        btn1.grid(row=3,column = 0,columnspan=1)
        #btn1['command'] = lambda: controller.show_frame(Page2)


        self.var1 = tk.BooleanVar()

        rButton1 = tk.Radiobutton(self,variable = self.var1,value=True)
        rButton1.grid(row=2,sticky = "W")

        rButton2 = tk.Radiobutton(self,variable = self.var1,value=False)
        rButton2.grid(row=2,column=1,sticky = "W")

        if self.var1.get() == 1:
            btn1['command'] = lambda: controller.show_frame(Page3)

        if self.var1.get() == 0:
            btn1['command'] = lambda: controller.show_frame(Page2)


class Page2(tk.Frame):
    def __init__(self,parent,controller):
        tk.Frame.__init__(self,parent)

        lbl = tk.Label(self,text="This is page 2",font=("Helvetica",12,"bold"))
        lbl.pack()


class Page3(tk.Frame):
    def __init__(self,parent,controller):
        tk.Frame.__init__(self,parent)

        lbl = tk.Label(self,text="This is page 3",font=("Helvetica",12,"bold"))
        lbl.pack()

app = MainApp()
app.mainloop()
我假设通过使用一些基本条件(位于我的PageOne类中)——


我可以做到这一点,但它似乎不起作用。if语句中的条件是整数,但据我所知,1表示True,0表示True;还是假的?我做错了什么?

我想这就是你想要的。我没有处理确保默认情况下未选择radiobutton。我把它作为练习留给你了。尽管如此,如果您想要像这样切换页面,我只需要使用按钮(
tk/ttk.Button
),那么您不必担心如何处理单选按钮。虽然,这只是我的偏好,当然,两者都可以。您只需绑定每个按钮即可切换页面。我在下面修改的代码中注释了这些按钮。 如果您想创建按钮/单选按钮,以便为每个页面提供前进/后退选项。您只需在控制器帧上迭代以查看哪个是当前的,然后创建两个类似于下面的按钮以移动到其他帧

import tkinter as tk

class MainApp(tk.Tk):

    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)

        # the main container that holds all the frames
        container = tk.Frame(self)

        container.pack(side = "top", fill = "both", expand = True)
        container.grid_rowconfigure(0, weight = 1)
        container.grid_columnconfigure(0,weight = 1)


        self.frames = {}

        # adding frames to the dictionary
        for F in (Page1,Page2,Page3):

             frame = F(container,self)

             self.frames[F] = frame

             frame.grid(row = 0, column = 0, sticky = "w")

        self.show_frame(Page1)

    def show_frame(self,page_name):

        #SHOWS A FRAME WITH THE GIVEN NAME
        for frame in self.frames.values():
            frame.grid_remove()
        frame = self.frames[page_name]
        frame.grid()

    #STACKING THE FRAMES
    #frame = self.frames[cont]
    #frame.tkraise()

class Page1(tk.Frame):
    def __init__(self,parent,controller):
        tk.Frame.__init__(self,parent)
        self.controller = controller

        lbl1 = tk.Label(self,text = "for page 2",font =("Helvetica",12,"bold"))
        lbl1.grid(row=1,sticky="W")

        lbl2 = tk.Label(self,text = "for page 3",font =("Helvetica",12,"bold"))
        lbl2.grid(row=1,column=1,sticky="W")

        btn1 = tk.Button(self, text="next page", font=('MS', 24, 'bold'))
        btn1.grid(row=3,column = 0,columnspan=1)
        #btn1['command'] = lambda: controller.show_frame(Page2)


        self.var1 = tk.BooleanVar()

        #rButton1 = tk.Button(self, text='Show Page 2', command=lambda: self.controller.show_frame(Page2))
        #rButton1.grid(row=2, sticky="W")
        #rButton2 = tk.Button(self, text='Show Page 3', command=lambda: self.controller.show_frame(Page3))
        #rButton2.grid(row=2, column=1, sticky="W")

        rButton1 = tk.Radiobutton(self,variable = self.var1,value=True,
            command=self.switch_pages)
        rButton1.grid(row=2,sticky = "W")

        rButton2 = tk.Radiobutton(self,variable = self.var1,value=False,
            command=self.switch_pages)
        rButton2.grid(row=2,column=1,sticky = "W")

    def switch_pages(self):

        if not self.var1.get():
            self.controller.show_frame(Page3)
        else:
            self.controller.show_frame(Page2)


class Page2(tk.Frame):
    def __init__(self,parent,controller):
        tk.Frame.__init__(self,parent)

        lbl = tk.Label(self,text="This is page 2",font=("Helvetica",12,"bold"))
        lbl.pack()


class Page3(tk.Frame):
    def __init__(self,parent,controller):
        tk.Frame.__init__(self,parent)

        lbl = tk.Label(self,text="This is page 3",font=("Helvetica",12,"bold"))
        lbl.pack()

app = MainApp()
app.mainloop()

如果不是self.var1.get():AttributeError:Page1实例没有属性“controller”,听起来好像您没有设置
self.controller=controller
。如果还没有,请尝试复制/粘贴上面的代码?理想情况下,我仍然希望“下一页”按钮保留其功能。我这样做是因为我打算在一个更大的项目中使用它,类似这样:一份包含10个问题的问卷,每个问题都有一个对应的“是”和“否”单选按钮。在完成问卷调查后,一旦他们点击“下一页”按钮,我希望显示一个特定的框架,相关框架将填充文本,例如文本可以阅读“根据您的选择,这是您的建议…”干杯,谢谢它成功了!但理想情况下,我希望它能像我的新评论中提到的那样
import tkinter as tk

class MainApp(tk.Tk):

    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)

        # the main container that holds all the frames
        container = tk.Frame(self)

        container.pack(side = "top", fill = "both", expand = True)
        container.grid_rowconfigure(0, weight = 1)
        container.grid_columnconfigure(0,weight = 1)


        self.frames = {}

        # adding frames to the dictionary
        for F in (Page1,Page2,Page3):

             frame = F(container,self)

             self.frames[F] = frame

             frame.grid(row = 0, column = 0, sticky = "w")

        self.show_frame(Page1)

    def show_frame(self,page_name):

        #SHOWS A FRAME WITH THE GIVEN NAME
        for frame in self.frames.values():
            frame.grid_remove()
        frame = self.frames[page_name]
        frame.grid()

    #STACKING THE FRAMES
    #frame = self.frames[cont]
    #frame.tkraise()

class Page1(tk.Frame):
    def __init__(self,parent,controller):
        tk.Frame.__init__(self,parent)
        self.controller = controller

        lbl1 = tk.Label(self,text = "for page 2",font =("Helvetica",12,"bold"))
        lbl1.grid(row=1,sticky="W")

        lbl2 = tk.Label(self,text = "for page 3",font =("Helvetica",12,"bold"))
        lbl2.grid(row=1,column=1,sticky="W")

        btn1 = tk.Button(self, text="next page", font=('MS', 24, 'bold'))
        btn1.grid(row=3,column = 0,columnspan=1)
        #btn1['command'] = lambda: controller.show_frame(Page2)


        self.var1 = tk.BooleanVar()

        #rButton1 = tk.Button(self, text='Show Page 2', command=lambda: self.controller.show_frame(Page2))
        #rButton1.grid(row=2, sticky="W")
        #rButton2 = tk.Button(self, text='Show Page 3', command=lambda: self.controller.show_frame(Page3))
        #rButton2.grid(row=2, column=1, sticky="W")

        rButton1 = tk.Radiobutton(self,variable = self.var1,value=True,
            command=self.switch_pages)
        rButton1.grid(row=2,sticky = "W")

        rButton2 = tk.Radiobutton(self,variable = self.var1,value=False,
            command=self.switch_pages)
        rButton2.grid(row=2,column=1,sticky = "W")

    def switch_pages(self):

        if not self.var1.get():
            self.controller.show_frame(Page3)
        else:
            self.controller.show_frame(Page2)


class Page2(tk.Frame):
    def __init__(self,parent,controller):
        tk.Frame.__init__(self,parent)

        lbl = tk.Label(self,text="This is page 2",font=("Helvetica",12,"bold"))
        lbl.pack()


class Page3(tk.Frame):
    def __init__(self,parent,controller):
        tk.Frame.__init__(self,parent)

        lbl = tk.Label(self,text="This is page 3",font=("Helvetica",12,"bold"))
        lbl.pack()

app = MainApp()
app.mainloop()