2012-10-11 3 views
0


У меня есть некоторые проблемы с моей «BackButton» в этой программе Python с графическим интерфейсом Tkinter. MainFrame - это кадр с динамическим контентом.
В обоих пунктах меню (Конфигурация устройства и команда SCPI) я хотел бы реализовать BackButton, который возвращает меня в предыдущий Frame/Window, в этом случае MainFrame/MainMenu. Я немного смущен мастер-кадром SCPIMenu, где я ввел «???».
Есть ли идеи, как реализовать это? Спасибо за ваше время.Tkinter Frame с BackButton to MainMenu

class View(Tk): 
    def __init__(self): 
     Tk.__init__(self) 
     self.title('Device Configurator') 
     self.geometry('400x400') 
     self.resizable(0,0) 

     self.MainFrame = Frame(self, bd = '2', relief = RIDGE) 
     self.MainFrame.pack(expand = True, fill="both", padx = 5, pady = 20) 

     menubar = Menu(self) 
     filemenu = Menu(menubar, tearoff=0) 
     filemenu.add_command(label='Configure Devices', command = None) 
     filemenu.add_command(label='Exit', command=self.quit) 
     menubar.add_cascade(label='File', menu=filemenu) 
     infomenu = Menu(menubar, tearoff = 0) 
     infomenu.add_command(label='About', command = None) 
     menubar.add_cascade(label='Info', menu = infomenu) 
     self.config(menu = menubar) 

    def mainMenu(self): 
     configButton = Button(self.MainFrame, text = 'Device Configuration') 
     configButton.place(x=200, y=150,anchor=CENTER) 

     SCPIButton = Button(self.MainFrame, text = 'SCPI Command', command = self.SCPIMenu) 
     SCPIButton.place(x=200, y=200,anchor=CENTER) 

    def SCPIMenu(self): 
     self.SCPIFrame = Frame(???, bd = '2', relief = RIDGE) 
     self.SCPIFrame.pack(expand = True, fill="both", padx = 5, pady = 20) 
     BackButton = Button(???, text = 'Back', command = self.mainMenu) 
     BackButton.place(x=350, y=330, anchor=CENTER) 






##The controller understands both the model and the view. 
class Controller(object): 
    def __init__(self): 
     self.view = View() 
     self.view.mainMenu() 
     self.view.mainloop() 


c = Controller() 
+0

Возможно, вы можете взглянуть на этот вопрос на сокрытие виджетов (http://stackoverflow.com/q/3819354). Здесь вы можете сделать выбор между просмотром ваших экранов как метода, который их рисует (и в конечном итоге удалите то, что было там раньше), или как «Frame', который вы заполняете при запуске, а затем показываете или скрываете. Позднее я получил предпочтение (поскольку для меня больше GUI/State ориентировано, чем процедурный, и может ограничивать зависимости). – FabienAndre

+0

, когда вы изначально нажимаете кнопку «Команда SCPI», что вы хотите сделать? Вы хотите, чтобы все содержимое окна было заменено кадром SCPIMenu, или вы хотите, чтобы этот фрейм в отдельном всплывающем окне или что-то еще? –

+0

Я хочу, чтобы все содержимое окна было заменено кадром SCPIMenu, и когда я нажимаю кнопку «Назад», я хочу вернуться в главное меню, поэтому MainFrame. – eljobso

ответ

0

Я хотел бы предложить вам создать метод, где вы создаете свой начальный кадр и вызывать его в вас INIT (Я).

таким образом, когда вы звоните youe команда MainMenu в кнопке, ваша рамка будет сбрасываться на исходные параметры

Я просто повторно использовать код и употреблено в пищу его в вашем методе, нету пробовал, но shoudl быть в состоянии что-то подобное

def mainMenu(self): 

    self.MainFrame = Frame(self, bd = '2', relief = RIDGE) 
    self.MainFrame.pack(expand = True, fill="both", padx = 5, pady = 20 

    configButton = Button(self.MainFrame, text = 'Device Configuration') 
    configButton.place(x=200, y=150,anchor=CENTER) 

    SCPIButton = Button(self.MainFrame, text = 'SCPI Command', command = self.SCPIMenu) 
    SCPIButton.place(x=200, y=200,anchor=CENTER) 
    self.MainFrame = Frame(self, bd = '2', relief = RIDGE) 
    self.MainFrame.pack(expand = True, fill="both", padx = 5, pady = 20)