我正在尝试创建一个类并从中继承,Toplevel()
以便该类的 GUI 元素可以包含在单独的窗口中。通常我只是继承自,Frame()
但为了我的目的,我需要所有东西都在一个窗口中。我正在我的 GUI 模板脚本中编写代码,这样我就可以在将它粘贴到我想要使用它的实际脚本之前弄清楚如何让它工作。这是代码:
from Tkinter import *
import socket
myplayername = ''
class Application(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.pack()
class InfoLabel(Frame):
def __init__(self, name, value, bgc, nfgc, vfgc, master=None):
Frame.__init__(self, master)
self.pack()
Label(master=self, text=name, bg=bgc, fg=nfgc).pack({"side": "left"})
Label(master=self, text=value, bg=bgc, fg=vfgc).pack({"side": "left"})
class LabelEntry(Frame):
def __init__(self, name, variable, bgc, fgc, entrysize, master=None):
Frame.__init__(self, master)
self.pack()
Label(master=self, text=name, bg=bgc, fg=fgc).pack({"side": "left"})
Entry(master=self, textvariable=variable, bg=bgc).pack({"side": "left"})
class HostGameWindow(Toplevel):
def __init__(self):
global myplayername
Toplevel.__init__(self)
self.title('Host a Game')
hostname = socket.gethostname()
hostipaddr = socket.gethostbyname(hostname)
hostport = 11489
players = 0
portsv = StringVar(value=str(hostport))
numofplayers = StringVar(value=str(players))
myname = StringVar(value=myplayername)
hostgameframe = Frame(master=self, bg='#999', bd=3, relief=RIDGE, padx=5, pady=5).pack({"side": "left"})
hoststatusframe = Frame(master=self, bg='white', bd=3, relief=RIDGE).pack({"side": "left"})
hostbuttonframe = Frame(master=hostgameframe, bd=2, relief=RAISED, padx=5, pady=5).pack({"side": "bottom"})
InfoLabel(master=hostgameframe, name='Hostname:', value=hostname, bgc='#999', nfgc='blue', vfgc='red').pack({"side": "top"})
InfoLabel(master=hostgameframe, name='IP Address:', value=hostipaddr, bgc='#999', nfgc='blue', vfgc='red').pack({"side": "top"})
LabelEntry(master=hostgameframe, name='Host on port:', variable=portsv, bgc='#999', fgc='blue', entrysize=len(str(hostport))).pack({"side": "top"})
LabelEntry(master=hostgameframe, name='Players Joining:', variable=numofplayers, bgc='#999', fgc='blue', entrysize=2).pack({"side": "top"})
LabelEntry(master=hostgameframe, name='Player Name:', variable=myname, bgc='#999', fgc='blue', entrysize=16).pack({"side": "top"})
Button(master=hostbuttonframe, text='Host Game', width=10).pack({"side": "left"})
Button(master=hostbuttonframe, text='Start Game', width=10).pack({"side": "left"})
def close():
self.destroy()
def HostGameDialog():
HostGameWindow()
Button(master=self, text='Host a Game', command=HostGameDialog).pack()
root = Tk()
app = Application(master=root)
#root.wm_iconbitmap(default='INSERT ICON HERE')
#root.wm_title("TITLE OF PROGRAM")
#app.master.maxsize(640, 480)
app.master.minsize(640, 480)
app.master.resizable(0, 0)
app.mainloop()
app.quit()
现在由于某种原因,当我单击“托管游戏”按钮时,它会调用该HostGameDialog()
函数并HostGameWindow()
创建HostGameWindow()
类改为出现在主Application()
框架中。对我来说真正奇怪的是它不会给出任何错误,它只是将所有小部件放在主应用程序框架中,而不是Toplevel()
创建的。
我到底做错了什么?为什么没有任何小部件放在里面Toplevel()
?我已经做了几个小时了,没有任何意义。如果您知道任何可能对我有帮助的事情,请告诉我。
哇,我从来没有在这里等过这么久的回复,这一定是一个非常漂亮的问题,我仍然不知道该怎么办。任何想法都非常感谢!
我想没有人知道该怎么做...不过我会继续检查这里!
解决了!如果您创建对它的引用,那么在同一行上创建和打包一个小部件并不是一个好主意。Widget(args*).pack(args*)
仅当您只调用而不创建对它的引用时,才能在同一行创建和打包小部件。