2017-06-29 20 views
1

我想回去的主網頁時在Done按鈕用戶按下。如何切換到一個框架中主要

我有兩個文件:

gui_main.py:有幾幀

gui_scan.py主界面:執行掃描,當用戶按下按鈕Done返回到位於gui_main.py主菜單框架。

問題:每當我稱爲幀從gui_main.py,我得到一個KeyError因爲框架不位於主框架列表。 經過很多調試,我發現我錯誤地引用了gui_main.py中的幀。這是怎麼了引用它:

這裏是一個MVCE等效代碼:

#gui_main.py 
import tkinter as tk 
from tkinter import ttk 

# External file imports 
import gui_scan as scan 
from gui_frame import PageFrame 


class MainWindow(tk.Tk): 
    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 
     print("Loading") 

     print ("Constructing Frames") 
     self.frames = {} 
     for F in (PageOne,Menu, Settings, scan.PerformScan): 
      frame = F(container, self) 
      self.frames[F] = frame 

    def show_frame(self, frame_name): 
     """ Show @frame_name frame """ 
     self.active_frame = self.frames[frame_name] # <-- this causes the error 
     self.active_frame.tkraise() 

# PageOne Frame Class 
class PageOne(PageFrame): 
    def __init__(self, parent, controller): 
    """ ....""" 
    # Implementation of this is iirelavant to question 

# Menu Frame Class 
class Menu(PageFrame): 
    def __init__(self, parent, controller): 
    """ ....""" 
    # Implementation of this is iirelavant to question 

# Settings Frame Class 
class Settings(PageFrame): 
    def __init__(self, parent, controller): 
    """ ....""" 
    # Implementation of this is iirelavant to question 

if __name__ =="__main__": 
    try: 
     app = MainWindow() 
    except Exception: 
     # Problems 
     print ("Problems running GUI") 

其他文件:

#gui_scan.py 
import tkinter as tk 

from gui_frame import PageFrame 
import gui_main as main 

class PerformScan(PageFrame): 
    def __init__(self, parent, controller): 
     PageFrame.__init__(self, parent, controller) 
     label = tk.Label(self, padx=0, text="When you are ready press \"Start\" \n", justify=tk.CENTER) 
     label.pack() 

     button = tk.Button(self, text='Start', command=lambda: self.run_scan()) 
     button.pack() 

    def run_scan(self): 
     """ Run a scan""" 
     # The scan runs here 

     # at the end, have the user press `Done` and go back to Menu from `gui_main.py` 
     self.button_frame = tk.Frame(self.final_frame, bg="red") 
     self.button = tk.Button(self.button_frame, text = "Done", 
      command = lambda:self.controller.show_frame(main.Menu)) # <-- this is wrong,(I think) 
     self.button.grid(row = 0, column=3, padx = 5) 
     self.button_frame.pack() 

調試: 打印出self.frames幀from main_gui:

Frame: <class '__main__.PageOne'> 
Frame: <class '__main__.Menu'> 
Frame: <class '__main__.Settings'> 
Frame: <class 'gui_scan.PerformScan'> 

按下run_scan(self)通行證的Done按鈕在此:

<class 'gui_main.Menu'> 

這產生一個錯誤,而我停留在我在,而不是切換回Menu幀幀一切。

+0

您是否嘗試過運行您的mcve?它沒有。只有太多的按鈕才能按下(GUI不會啓動)。 –

+0

模塊缺少gui_frame.py來幫助你,然後檢查每個文件裏面的導入 – PRMoureu

+0

@RonNorris我爲新手MCVE道歉。我不能包含所有內容,因爲我沒有編寫代碼,而只是繼續開發。我沒有代碼的版權,並且我正在重命名我提供的MCVE中的所有內容。 –

回答

0

我想通了。

解決方案:

獨立class PageOne(PageFrame)class Menu(PageFrame),並class Settings(PageFrame)從主文件,並將其導入內部gui_scan.py。這避免了嘗試導入主文件的問題,並且還使主文件更加有組織。

相關問題