2017-06-29 7 views
1

ボタンを押したときにメインページに戻ろうとしています。メインのフレームに切り替える方法

gui_main.py:いくつかのフレーム

gui_scan.py

を持っているメインGUI:スキャンを実行し、ユーザーが Doneボタンを押したときに gui_main.pyにあるメインメニューのフレームに戻る

私は2つのファイルを持っています。

問題:私は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内でそれらをインポートします。これにより、メインファイルをインポートしようとする問題を回避し、メインファイルをより組織化します。

関連する問題