为什么我的tkinter返回按钮不起作用?



我用我的tkinter做了2页。主页有一个按钮,将用户带到Classifier_UI页面。在Classifier_UI页面中,我创建了一个返回按钮,将用户带回到主页面。如果我只运行Classifier_UI.py,后退按钮就可以正常工作。它确实把我带回了主页面。但是,如果我从main_page.py运行,然后单击将我带到Classifier_UI页面的按钮,然后单击返回按钮,窗口将自动关闭,并且不会将我带回到主页面。为什么会发生这种情况,我该如何解决?

下面是我在主页中创建的按钮代码:

from tkinter import *
class Test:
def __init__(self, tk):
fm = Frame(tk)
self.l1 = Label(tk, text="Welcome", font=("Helvetica", 38, 'bold'), bg='LightGoldenrod2', fg='gray24').place(relx=0.25, rely=0.15)
self.b2 = Button(tk, bg='LightGoldenrod4', text="Classifier 1", font=("Helvetica", '10', 'bold'), foreground="white", width = 24, height = 3, command=self.change).pack(side=LEFT, expand=YES, padx=110, pady=300)
fm.pack(fill=BOTH, expand=YES)

def change(self):
tk.destroy()
import Classifier_UI

img_path = StringVar()
canvas = tk.Canvas(root, height = '700', width= '750', bg='#292828')
canvas.pack(fill=BOTH)


tk = Tk()
tk['bg']='LightGoldenrod2'
tk.toolbar = Frame(tk, bg="white")

width= tk.winfo_screenwidth() 
height= tk.winfo_screenheight()
tk.geometry("%dx%d" % (width, height))
tt = Test(tk)
tk.mainloop()

这是我的第二个页面的按钮代码:

def change():
root.destroy()
import main_page

root = tk.Tk()
root.title("Image Classifier")
browse = tk.Button(text="Back", bg='white', font='courier 10', command=change)
browse.place(relx = 0.75 ,rely = 0.85, relwidth = 0.12, relheight=0.05)
root.mainloop()

问题是tk.destroy()root.destroy()关闭窗口,因为您正在调用窗口的destroy()方法,而不是框架方法。尝试做self.destroy()时,你的类是指一个框架,这将破坏只是框架,而不是整个窗口,但是,当框架被破坏,你没有其他的方法,使它收割,但创建另一个实例。另外,你不应该在函数中导入模块,除非你想让导入成为可选的,否则把所有的导入都放在脚本的开头。

更重要的是,在这两个文件中,您创建了一个根窗口并销毁它,如果您只想更改显示的框架,则不需要这样做。我建议你在窗户里放两个框架,一个在另一个的上面,当按钮被按下时,在框架之间来回切换。

下面是一个简单的代码示例,在两个帧之间切换按钮(注意,我已经将按钮直接放在窗口内,而不是在框架内,使其独立于更改,但如果你愿意,你可以为每一帧放置一个):
import tkinter as tk

class MainWindow(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.frame_on_top = 1
self.switch_frame_button = tk.Button(self, text='switch', command=self.switch_frame)
self.switch_frame_button.grid(row=0, column=0)
self.container = tk.Frame(self)    # This is the position where we will put the frames.
self.container.grid(row=1, column=0)
self.frames = {}
counter = 2
# Now let's make our frames.
# Starting from the second, so that the first frame will be put on top (last in first out).
for fr in (SecondFrame, FirstFrame):
frame = fr(parent=self)
self.frames[str(counter)] = frame
frame.grid(row=1, column=0, sticky='nsew')  # Put all the frames in the same spot.
counter -= 1
def switch_frame(self):

if self.frame_on_top == 1:
frame = self.frames['2']
frame.tkraise()
self.frame_on_top = 2
elif self.frame_on_top == 2:
frame = self.frames['1']
frame.tkraise()
self.frame_on_top = 1

class FirstFrame(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
tk.Label(self, text='First frame').pack()

class SecondFrame(tk.Frame):
def __init__(self, parent):    
tk.Frame.__init__(self, parent)
tk.Label(self, text='Second frame').pack()

root = MainWindow()
root.mainloop()

尝试创建一个按钮,它的命令返回到该函数

def BackFunction(self):
pass
def __init__(self):
back = Button(root, command=self.BackFunction)

最新更新