2016-04-02 3 views
0

Я пробую простой эксперимент, у меня 3 кадра, у кадра 1 есть две метки - «для страницы 2» и «для страницы 3», у него также есть 2 переключателя, соответствующие этикетки. на основе которой радио-кнопка выбрана, когда пользователь нажимает на кнопку следующую страницу, я хочу кнопку, чтобы привести пользователя к выбранной страницеизменение фреймов на основе ответа радиокнопки

это код -

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

 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) 

я смог бы добиться этого, но это не похоже на работу. Условия в моих операторах if являются целыми числами, но, насколько мне известно, 1 означает True и 0; В любом случае, ложно? Что я делаю не так?

ответ

0

Я думаю, что это то, что вы хотите. Я не справился с тем, чтобы убедиться, что радиобудильник не выбран по умолчанию. Я оставил это как упражнение для вас. Хотя, если вы хотите просто переключаться на такие страницы, я бы просто использовал кнопки (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() 
+0

Это не совсем работа, дает мне это - если не self.var1.get(): AttributeError: экземпляр Стр.1 не имеет атрибута «контроллер» – Treeno1

+0

звучит как вы не установили 'self.controller = контроллер'. Попробуйте скопировать/вставить код выше, если вы этого еще не сделали? – Pythonista

+0

в идеале, я бы по-прежнему хотел, чтобы кнопка «Следующая страница» сохранила свою функциональность. Я сделал это так, потому что я намерен использовать его в более крупном проекте, примерно так: вопросник с 10 вопросами, каждый из которых имеет соответствующую кнопку «Да» и «Нет». После заполнения вопросника, как только они нажмут кнопку «Следующая страница», я хочу, чтобы отображался конкретный фрейм, соответствующий кадр будет заполнен текстом, в качестве примера, который может прочитать текст: «Основываясь на ваших вариантах, это ваша рекомендация ... » – Treeno1