2015-07-09 4 views
2

Я смотрю here. Я могу разделить мою страницу (фрейм) на два файла. Например, это мой первый файл: main.pyсплит более одного файла tkinter frame

from Tkinter import * 
from halsatu import * 
class Biasa(Tk): 
    def __init__(self, *args, **kwargs): 
     Tk.__init__(self, *args, **kwargs) 
     container = Frame(self) 
     container.pack(expand=True) 

     container.grid_rowconfigure(0, weight=1) 
     container.grid_columnconfigure(0, weight=1) 

     self.frames = {} 

     for F in (StartPage, PageOne, PageTwo): 
      frame = F(container, self) 
      frame.grid(row=0, column=0, sticky='news') 
      self.frames[F] = frame 
     self.show_frame(StartPage) 
    def show_frame(self, c): 
     frame = self.frames[c] 
     frame.tkraise() 

class StartPage(Frame): 
    def __init__(self, parent, controller): 
     Frame.__init__(self, parent) 
     label = Label(self, text='Ini halaman Awal') 
     label.pack() 

     button = Button(self, text='ke Halaman 1', 
      command=lambda: controller.show_frame(PageOne)) 
     button.pack() 
     button2 = Button(self, text='ke Hal. 2', 
      command=lambda: controller.show_frame(PageTwo)) 
     button2.pack() 

class PageTwo(Frame): 
    def __init__(self, parent, controller): 
     Frame.__init__(self, parent) 
     label = Label(self, text='Sekarang \nIni halaman Dua lho..') 
     label.pack() 

     button = Button(self, text='ke Halaman 1', 
      command=lambda: controller.show_frame(PageOne)) 
     button.pack() 
     button2 = Button(self, text='ke Hal. Awal', 
      command=lambda: controller.show_frame(StartPage)) 
     button2.pack() 



if __name__ == '__main__': 
    app = Biasa() 
    app.mainloop() 

Тогда это мой halsatu.py:

from Tkinter import * 
class PageOne(Frame): 
    def __init__(self, parent, controller): 
     Frame.__init__(self, parent) 
     label = Label(self, text='Kalau yang Ini halaman Satuuuuuuuuuuuuuuuuuu') 
     label.pack() 

     button = Button(self, text='ke Halaman Awal', 
      command=lambda: controller.show_frame(StartPage)) 
     button.pack() 
     button2 = Button(self, text='ke Hal. 2', 
      command=lambda: controller.show_frame(PageTwo)) 
     button2.pack() 

Этот код может работать. Но когда я иду на страницу, я больше не могу вернуться на StartPage. Как разбить так много страниц (кадров) на отдельные файлы?

+0

Вы получаете какую-либо ошибку? –

+0

есть. Когда я перехожу на страницу PageOne, а затем я нажимаю на первую кнопку, появляется эта ошибка: Исключение в обратном вызове Tkinter Traceback (последний последний звонок): Файл «/usr/lib/python2.7/lib-tk/Tkinter.py ", строка 1489, в __call__ return self.func (* args) Файл" /home/muktyas/Dropbox/py/tk/150709oop/0914/halsatu.py ", строка 10, в command = lambda: controller .show_frame (StartPage)) NameError: глобальное имя 'StartPage' не определено – recobayu

+0

Да, я так и думал, что 'StartPage' или' PageTwo' не импортируется в ваш 'halsatu.py', поэтому они не будут доступны –

ответ

1

Вы уже прошли мимо контроллера до PageOne, так что это может быть механизм для подъема страниц. Моя рекомендация - дать ссылку на страницы по имени, а не по классу, а затем дать контроллеру метод, который принимает имя и поднимает эту страницу. Таким образом, ваши страницы не должны импортировать друг друга, делая более свободную связь.

Это будет выглядеть примерно так:

class Biasa(Tk): 
    ... 
    def show_page(self, page_name): 
     for F in self.frames: 
      if F.__name__ == page_name: 
       self.show_frame(F) 
       return 

class PageOne(Frame): 
    def __init__(self, parent, controller): 
     ... 
     button = Button(..., command=lambda: controller.show_page("StartPage")) 
     ... 
Смежные вопросы