Python Tkinter:代码停止,窗口不运行';我没有出现

Python Tkinter:代码停止,窗口不运行';我没有出现,python,tkinter,Python,Tkinter,我正在使用Tkinter在Python上开发一个非常基本的界面,它显示两个输入框和一个登录按钮。我尝试通过创建不同的帧来实现这一点,并在用户登录时更改帧。它工作得很好,但随后代码开始执行自己,有时不完全执行,有时完全执行,但没有Tkinter窗口。我调查了一下,没有发现什么令人震惊的事情,但我不是专家,所以我正在寻求帮助。 这是运行实现Tkinter窗口的类的代码: print 1 app = Skeleton("HomePage") print 2 app.mainloop() print 3

我正在使用Tkinter在Python上开发一个非常基本的界面,它显示两个输入框和一个登录按钮。我尝试通过创建不同的帧来实现这一点,并在用户登录时更改帧。它工作得很好,但随后代码开始执行自己,有时不完全执行,有时完全执行,但没有Tkinter窗口。我调查了一下,没有发现什么令人震惊的事情,但我不是专家,所以我正在寻求帮助。 这是运行实现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()
实现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)