Python Tkinter:代码停止,窗口不运行';我没有出现
我正在使用Tkinter在Python上开发一个非常基本的界面,它显示两个输入框和一个登录按钮。我尝试通过创建不同的帧来实现这一点,并在用户登录时更改帧。它工作得很好,但随后代码开始执行自己,有时不完全执行,有时完全执行,但没有Tkinter窗口。我调查了一下,没有发现什么令人震惊的事情,但我不是专家,所以我正在寻求帮助。 这是运行实现Tkinter窗口的类的代码:Python Tkinter:代码停止,窗口不运行';我没有出现,python,tkinter,Python,Tkinter,我正在使用Tkinter在Python上开发一个非常基本的界面,它显示两个输入框和一个登录按钮。我尝试通过创建不同的帧来实现这一点,并在用户登录时更改帧。它工作得很好,但随后代码开始执行自己,有时不完全执行,有时完全执行,但没有Tkinter窗口。我调查了一下,没有发现什么令人震惊的事情,但我不是专家,所以我正在寻求帮助。 这是运行实现Tkinter窗口的类的代码: print 1 app = Skeleton("HomePage") print 2 app.mainloop() print 3
print 1
app = Skeleton("HomePage")
print 2
app.mainloop()
print 3
class Skeleton(Tk):
def __init__(self, f,*args, **kwags):
Tk.__init__(self,*args, **kwags)
self.title(f)
container = Frame(self, width=512, height=512)
container.pack(side="top", fill="both", expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
frameName = {"home","upload","retrieve","deconnected"}
self.frames["HomePage"] = HomePage(parent= container, controller=self)
self.frames["HomePage"].grid(row=0, column=0, sticky="nsew")
print 321
self.show_frame("HomePage")
def show_frame(self, page_name):
'''Show a frame for the given page name'''
print "Je vais te montrer mon frame"
frame = self.frames[page_name]
frame.tkraise()
实现Tkinter窗口的骨架类:
print 1
app = Skeleton("HomePage")
print 2
app.mainloop()
print 3
class Skeleton(Tk):
def __init__(self, f,*args, **kwags):
Tk.__init__(self,*args, **kwags)
self.title(f)
container = Frame(self, width=512, height=512)
container.pack(side="top", fill="both", expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
frameName = {"home","upload","retrieve","deconnected"}
self.frames["HomePage"] = HomePage(parent= container, controller=self)
self.frames["HomePage"].grid(row=0, column=0, sticky="nsew")
print 321
self.show_frame("HomePage")
def show_frame(self, page_name):
'''Show a frame for the given page name'''
print "Je vais te montrer mon frame"
frame = self.frames[page_name]
frame.tkraise()
以及主页框架的代码:
class HomePage(Frame):
def __init__(self, parent, controller):
Frame.__init__(self, parent)
self.parent = parent
self.controller = controller
#print ("Construction de la page dáccueil")
#LABEL
self.username = Label(self, text="Username:")
self.username.grid(row =0,column =0)
self.username.pack()
#ENTRY
self.username_txb = Entry( self)
self.username_txb.focus_set()
self.username_txb.grid(row =0,column =1)
self.username_txb.pack(side=LEFT)
#LABEL
self.pass_lbl = Label(self, text="Password:")
self.pass_lbl.grid(row =0,column =2)
#ENTRY
self.password_txb = Entry( self, text="Password", show = "*")
self.password_txb.grid(row =0,column =3)
self.password_txb.pack(side=LEFT)
#LOGIN BUTTON
self.login_btn = Button(self, text="Login", command=lambda: controller.show_frame("UploadPage"))
self.login_btn.grid(row =0,column =4)
self.login_btn.pack(side=LEFT)
self.info_pane = PanedWindow()
self.info_pane.grid(row =1,column =0)
self.info_pane.pack(fill="none", expand=True, side=BOTTOM)
self.info_lbl = Label(self, text="More information about access:", fg="blue", cursor="hand2")
self.contact_lbl = Label(self, text="Contact us", fg="blue", cursor="hand2")
self.contact_lbl.grid(row =2,column =0)
self.contact_lbl.pack()
self.contact_lbl.bind("<Button-1>", self.callback)
print ("123Construction de la page dáccueil")
#self.parent.update()
def callback(self, event):
pass
def connect(self,controller ):
login = self.username_txb.get()
pwd = self.password_txb.get()
if(login == "a" and pwd == "a"):
print "Valid account"
self.controller.show_frame("UploadPage")
#UploadPage frame is implemented
班级主页(框架):
定义初始化(自、父、控制器):
帧。\uuuu初始化(自,父)
self.parent=parent
self.controller=控制器
#印刷品(“第页施工”)
#标签
self.username=标签(self,text=“username:”)
self.username.grid(行=0,列=0)
self.username.pack()
#入口
self.username\u txb=条目(self)
self.username\u txb.focus\u set()
self.username\u txb.grid(行=0,列=1)
self.username\u txb.pack(侧面=左侧)
#标签
self.pass\u lbl=标签(self,text=“Password:)
自我传递网格(行=0,列=2)
#入口
self.password\u txb=输入(self,text=“password”,show=“*”)
self.password\u txb.grid(行=0,列=3)
self.password\u txb.pack(侧面=左侧)
#登录按钮
self.login\u btn=按钮(self,text=“login”,command=lambda:controller.show\u frame(“上传页面”))
self.login\u btn.grid(行=0,列=4)
self.login\u btn.pack(侧面=左侧)
self.info_pane=PanedWindow()
self.info_pane.grid(行=1,列=0)
self.info_pane.pack(fill=“none”,expand=True,side=BOTTOM)
self.info\u lbl=标签(self,text=“有关访问的更多信息:”,fg=“蓝色”,cursor=“hand2”)
self.contact\u lbl=标签(self,text=“contact us”,fg=“blue”,cursor=“hand2”)
自接触网格(行=2,列=0)
self.contact_lbl.pack()
self.contact\u lbl.bind(“,self.callback)
打印(“第123页制作”)
#self.parent.update()
def回调(自身、事件):
通过
def连接(自身、控制器):
login=self.username\u txb.get()
pwd=self.password\u txb.get()
如果(登录名==“a”和pwd==“a”):
打印“有效帐户”
self.controller.show_帧(“上传页面”)
#实现了上传页面框架
每次执行代码时的输出如下所示:
一,
123建筑工程
提前谢谢你的帮助。希望这能帮助其他人。首先让我们介绍一下您对
pack()
和grid()
的使用。
由于tkinter的设置方式,您不能同时在框架或窗口中的同一小部件上使用pack()
和grid()
例如,您可以使用pack()
对主框架和grid()
对该框架内的小部件进行打包,但不能在框架内同时使用两者
如果您的问题之一是每个小部件所在的位置,并且它正在随窗口扩展,那么您可以管理grid()
中的所有内容,因此我们可以在这里使用grid()
作为编写GUI时的首选
接下来,我们需要查看您对show_frame
的调用,因为您正在尝试在您提供给我们的代码中显示一个在self.frames
中不存在的帧
我创建了一个新类,因此可以使用以下代码行测试您的程序:
self.controller.show_框架(“上传页面”)
新类只是创建了一个基本框架,其中包含一个标签,表明框架确实通过tkrise()
正确上升
我做了一些一般性的清理,因为你的show_frame
方法采取了不必要的步骤来提升框架,你导入tkinter的方法不是最好的选择,还有一些其他质量更正
而不是使用:
frame = self.frames[page_name]
frame.tkraise()
我们只需一行就可以简化此方法,如下所示:
self.frames[page_name].tkraise()
import tkinter as tk
我还更改了导入tkinter的方式,因为如果无意中重写内置方法,使用*导入有时会导致问题。最好的选择是像这样导入tkinter:
self.frames[page_name].tkraise()
import tkinter as tk
请看下面的代码,如果您有任何问题,请告诉我。它应该提供允许主页
框架和上传页面
框架按预期工作所需的信息
import tkinter as tk
class Skeleton(tk.Tk):
def __init__(self, f,*args, **kwags):
tk.Tk.__init__(self,*args, **kwags)
self.title(f)
self.container = tk.Frame(self, width=512, height=512)
self.container.grid(row=0, column=0, sticky="nsew")
self.container.grid_rowconfigure(0, weight=1)
self.container.grid_columnconfigure(0, weight=1)
self.frames = {}
self.frames["HomePage"] = HomePage(parent=self.container, controller=self)
self.frames["HomePage"].grid(row=0, column=0, sticky="nsew")
self.frames["UploadPage"] = UploadPage(parent=self.container)
self.frames["UploadPage"].grid(row=0, column=0, sticky="nsew")
self.show_frame("HomePage")
def show_frame(self, page_name):
self.frames[page_name].tkraise()
class HomePage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.parent = parent
self.controller = controller
self.username = tk.Label(self, text="Username:")
self.username.grid(row =0,column =0)
self.username_txb = tk.Entry(self)
self.username_txb.focus_set()
self.username_txb.grid(row=0, column=1)
self.pass_lbl = tk.Label(self, text="Password:")
self.pass_lbl.grid(row =0,column =2)
self.password_txb = tk.Entry(self, text="Password", show="*")
self.password_txb.grid(row =0,column =3)
self.login_btn = tk.Button(self, text="Login", command=self.connect)
self.login_btn.grid(row=0, column=4)
self.info_pane = tk.PanedWindow()
self.info_pane.grid(row=1, column=0)
self.info_lbl = tk.Label(self, text="More information about access:", fg="blue", cursor="hand2")
self.contact_lbl = tk.Label(self, text="Contact us", fg="blue", cursor="hand2")
self.contact_lbl.grid(row=2, column=0)
self.contact_lbl.bind("<Button-1>", self.callback)
def callback(self, event):
pass
# webbrowser.open_new("https://www.tno.nl/nl/")
# I do not have the import for this webbrowser so I disabled it for testing.
def connect(self):
login = self.username_txb.get()
pwd = self.password_txb.get()
if(login == "a" and pwd == "a"):
self.controller.show_frame("UploadPage")
class UploadPage(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
tk.Label(self, text="This upload frame is a test to see if your code is working").grid(row=0, column=0)
if __name__ == "__main__":
app = Skeleton("HomePage")
app.mainloop()
将tkinter作为tk导入
类骨架(tk.tk):
定义初始值(self,f,*args,**kwags):
tk.tk.\uuuuu初始值(self,*args,**kwags)
标题(f)
self.container=tk.Frame(self,宽度=512,高度=512)
self.container.grid(行=0,列=0,sticky=“nsew”)
self.container.grid_rowconfigure(0,权重=1)
self.container.grid\u columnconfigure(0,权重=1)
self.frames={}
self.frames[“HomePage”]=主页(父级=self.container,控制器=self)
self.frames[“HomePage”].grid(行=0,列=0,sticky=“nsew”)
self.frames[“UploadPage”]=UploadPage(父级=self.container)
self.frames[“UploadPage”].grid(行=0,列=0,sticky=“nsew”)
自我展示框架(“主页”)
def显示框(自身,页面名称):
self.frames[页面名称].tkraise()
班级主页(tk.Frame):
定义初始化(自、父、控制器):
tk.Frame.\uuuu init\uuuuu(自,父)
self.parent=parent
self.controller=控制器
self.username=tk.Label(self,text=“username:”)
self.username.grid(行=0,列=0)
self.username\u txb=tk.Entry(self)
self.username\u txb.focus\u set()
self.username\u txb.grid(行=0,列=1)
self.pass\u lbl=tk.Label(self,text=“Password:)
自我传递网格(行=0,列=2)
self.password\u txb=tk.Entry(self,text=“password”,show=“*”)
self.password\u txb.grid(行=0,列=3)
self.login\u btn=tk.Button(self,text=“login”,command=self.connect)