gpt4 book ai didi

python - Tkinter:代码停止并且窗口不显示

转载 作者:太空宇宙 更新时间:2023-11-03 13:56:33 25 4
gpt4 key购买 nike

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

print 1
app = Skeleton("HomePage")
print 2
app.mainloop()
print 3

实现Tkinter窗口的骨架类:

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

每次执行代码的输出如下:

1 123Construction de la page dáccueil

预先感谢您的帮助。希望这对其他人有帮助。

最佳答案

首先让我们解决一下 pack()grid() 的使用问题。由于 tkinter 的设置方式,您不能同时在框架或窗口中的同一个小部件上使用 pack()grid()

您可以使用例如 pack() 来打包主框架,并使用 grid() 来打包该框架内的小部件,但不能在框架内同时使用这两者。

如果您的问题之一是每个小部件的位置,并且它随窗口扩展,您可以管理 grid() 内部的所有内容,因此我们只需使用 grid() 这里是我在编写 GUI 时更喜欢的。

接下来,我们需要查看您对 show_frame 的调用,因为您试图在您向我们提供的代码中显示 self.frames 中不存在的框架.

我创建了一个新类,以便可以使用这行代码测试您的程序:self.controller.show_frame("UploadPage")

新类只是创建一个基本框架,其中有一个标签,表明该框架确实通过 tkrise() 正确上升。

我做了一些常规清理,因为您的 show_frame 方法采取了不必要的步骤来提升框架,您导入 tkinter 的方法不是最佳选择,还进行了一些其他质量修正。

而不是使用:

frame = self.frames[page_name]
frame.tkraise()

我们可以用一行代码来简化这个方法,如下所示:

self.frames[page_name].tkraise()

我还更改了导入 tkinter 的方式,因为如果您无意中覆盖了内置方法,则使用 * 导入有时会导致问题。最好的选择是像这样导入 tkinter:

import tkinter as tk

请查看下面的代码,如果您有任何疑问,请告诉我。它应该提供允许 HomePage 框架和 UploadPage 框架按预期工作所需的信息。

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()

关于python - Tkinter:代码停止并且窗口不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49559806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com