【问题标题】:How to switch to a Frame in main如何切换到主框架
【发布时间】:2017-12-03 12:06:13
【问题描述】:

当用户按下Done 按钮时,我正试图返回主页。

我有两个文件:

gui_main.py: 有几个框架的主界面

gui_scan.py:当用户按下Done 按钮时,执行扫描并返回到位于gui_main.py 的主菜单框架。

问题:每当我从gui_main.py 调用一个框架时,我都会得到一个KeyError,因为该框架不在main 的框架列表中。 经过大量调试,我发现我错误地引用了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()

调试: 从 main_gui 打印出 self.frames 中的帧:

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 帧。

【问题讨论】:

  • 你试过运行你的 mcve 吗?它没有。有太多损坏,看不到要按下的按钮(GUI 不会启动)。
  • 缺少模块 gui_frame.py 来帮助你,然后检查每个文件中的导入
  • @RonNorris 我很抱歉有一个新手 MCVE。我不能包含所有内容,因为我没有编写代码,我只是继续开发。我没有代码的版权,我正在重命名我提供的 MCVE 中的所有内容。

标签: python-3.x user-interface tkinter tkinter-canvas


【解决方案1】:

我想通了。

解决方案:

从主文件中分离class PageOne(PageFrame)class Menu(PageFrame)class Settings(PageFrame),并将它们导入gui_scan.py。这样就避免了尝试导入主文件的问题,也让主文件更有条理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 2016-05-04
    • 1970-01-01
    相关资源
    最近更新 更多