类 的 tkinter 中的新 window 为空白
New window in tkinter with classes is blank
我有一些测试代码,它定义了几个 windows 和函数(一个用于显示框架,一个用于新的 window)。我在创建 new_window 函数时遇到了一个错误,因为它没有打开指定的 window,而是打开了一个空白函数。我认为这是因为我在 classes 中定义了 windows 与主 class 相关,并且 frame 在其中定义,但 window 不是,但我恐怕我对如何调试很迷茫。
非常感谢任何帮助!
import tkinter as tk
from tkinter import ttk
from tkinter.filedialog import askopenfilename
class Randomize(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
tk.Tk.wm_title(self, "Randomize those names!")
container = tk.Frame(self)
container.pack(side="top", fill="both", expand = True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (HomeWindow, NewWin):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(HomeWindow)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
##trying to create a new window instead of just changing the original one
def new_window(self, cont):
window = tk.Toplevel(self)
window.tkraise()
class HomeWindow(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self,parent)
label = ttk.Label(self, text="Choose a File and Start")
label.pack(pady=10,padx=10)
##calls NewWin in a new frame but the same window, works
button = ttk.Button(self, text="File",
command=lambda: controller.show_frame(NewWin))
button.pack()
##should call NewWin through new_window, instead opens blank window
button2 = ttk.Button(self, text="New Window",
command=lambda: controller.new_window(NewWin))
button2.pack()
class NewWin(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
label = ttk.Label(self, text="NewWindow")
label.pack(pady=10,padx=10)
button1 = ttk.Button(self, text="Back to Home",
command=lambda: controller.show_frame(HomeWindow))
button1.pack()
app = Randomize()
app.mainloop()
应该是
def new_window(self, cont):
window = tk.Toplevel(self)
frame = cont(window, window) # cont = NewWin
frame.pack()
但是框架中的按钮不起作用。新 window 没有 show_frame()
方法。
也许如果你使用
frame = cont(window, self) # self
然后新 window 中的按钮将改变主 window 中的框架。
我有一些测试代码,它定义了几个 windows 和函数(一个用于显示框架,一个用于新的 window)。我在创建 new_window 函数时遇到了一个错误,因为它没有打开指定的 window,而是打开了一个空白函数。我认为这是因为我在 classes 中定义了 windows 与主 class 相关,并且 frame 在其中定义,但 window 不是,但我恐怕我对如何调试很迷茫。
非常感谢任何帮助!
import tkinter as tk
from tkinter import ttk
from tkinter.filedialog import askopenfilename
class Randomize(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
tk.Tk.wm_title(self, "Randomize those names!")
container = tk.Frame(self)
container.pack(side="top", fill="both", expand = True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (HomeWindow, NewWin):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(HomeWindow)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
##trying to create a new window instead of just changing the original one
def new_window(self, cont):
window = tk.Toplevel(self)
window.tkraise()
class HomeWindow(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self,parent)
label = ttk.Label(self, text="Choose a File and Start")
label.pack(pady=10,padx=10)
##calls NewWin in a new frame but the same window, works
button = ttk.Button(self, text="File",
command=lambda: controller.show_frame(NewWin))
button.pack()
##should call NewWin through new_window, instead opens blank window
button2 = ttk.Button(self, text="New Window",
command=lambda: controller.new_window(NewWin))
button2.pack()
class NewWin(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
label = ttk.Label(self, text="NewWindow")
label.pack(pady=10,padx=10)
button1 = ttk.Button(self, text="Back to Home",
command=lambda: controller.show_frame(HomeWindow))
button1.pack()
app = Randomize()
app.mainloop()
应该是
def new_window(self, cont):
window = tk.Toplevel(self)
frame = cont(window, window) # cont = NewWin
frame.pack()
但是框架中的按钮不起作用。新 window 没有 show_frame()
方法。
也许如果你使用
frame = cont(window, self) # self
然后新 window 中的按钮将改变主 window 中的框架。