【发布时间】: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