使用Tkinter进行Python GUI编程
所以我正在创建一个游戏,现在我决定添加一个GUI。GUI代码如下所示:使用Tkinter进行Python GUI编程,python,user-interface,button,tkinter,Python,User Interface,Button,Tkinter,所以我正在创建一个游戏,现在我决定添加一个GUI。GUI代码如下所示: master = Tk() master.wm_title("Main Menu") a = Button.grid(master, text = "DOMINATE!", command = difficulty) a.grid(row = 0, column = 0) a.pack() mainloop() b = Button.grid(master, text = "Patch Notes", command =
master = Tk()
master.wm_title("Main Menu")
a = Button.grid(master, text = "DOMINATE!", command = difficulty)
a.grid(row = 0, column = 0)
a.pack()
mainloop()
b = Button.grid(master, text = "Patch Notes", command = changelog)
b.grid(row = 0, column = 1)
b.pack()
mainloop()
c = Button.grid(master, text = "Credits", command = credit)
c.grid(row = 1, column = 0)
c.pack()
mainloop()
d = Button.grid(master, text = "Rules", command = rules)
d.grid(row = 1, column = 1)
d.pack()
mainloop()
e = Button.grid(master, text = "Quit", command = exit)
e.grid(row = 2, column = 0)
e.pack()
mainloop()
我已经从Tkinter导入了函数*,这只是我1200行代码的一个片段。当我尝试运行它时,会出现以下错误:
TypeError:必须使用Button实例作为第一个参数调用未绑定的方法grid_configure()(改为使用Tk实例)
(Python对我来说是一种新语言,很抱歉遗漏了任何明显的或愚蠢的东西。我对编程也有点陌生)。你想要的是:
a = Button(master, text = "DOMINATE!", command = difficulty)
a.grid(row=...,column=...)
还有,不要这样做
a.grid(...)
a.pack(...)
在同一个小部件(甚至在同一个小部件内)上使用pack
和grid
可能会让您的计算机永远坐在那里,试图在两个几何体管理器之间协商合理的布局。要么只使用pack,要么只使用grid
最后,您只需要最后一个mainloop()
。您应该删除所有其他代码——尽管如果您有1200行代码,我怀疑更正这些代码会引发其他错误。错误“unbound method grid\u configure()必须使用按钮实例调用…”来自如下行:
a = Button.grid(...)
a = Button(...)
b = Button(...)
...
a.grid(...)
b.grid(...)
上面所做的是尝试在按钮
类上调用网格
方法,而不是在按钮
类的实例上调用。一般来说,任何“unboundmethod”错误都意味着——您试图调用类上的方法,而不是实例上的方法
相反,您必须首先创建按钮
类的实例,然后对该实例调用网格
。例如:
a = Button(...)
a.grid(...)
同样,对同一个小部件同时使用pack
和grid
也没有意义。用一个或另一个。如果使用网格
,则无需调用pack
最后,
mainloop
被设计为在所有小部件创建完成后只调用一次
另一方面,根据我的经验,如果将所有布局代码(grid
、pack
和place
)放在一起,GUI代码更容易维护。对于整个应用程序而言,不一定都在一起,但至少按包含窗口分组。例如,与此相反:
a = Button(...)
a.grid(...)
b = Button(...)
b.grid(...)
...
。。。我建议这样做:
a = Button.grid(...)
a = Button(...)
b = Button(...)
...
a.grid(...)
b.grid(...)
这种代码组织方式更容易发现布局问题,例如在同一行或同一列中有多个项目等。主要错误来自“主”按钮,而“主”按钮不是:
a = Button.grid(master, text = "DOMINATE!", command = difficulty)
改为:
a = Button(master, text = "DOMINATE!", command = difficulty)
Button.grid(master.a,row=0,column=0,rowspan=1,columnspan=1,sticky='wens')
网格放置线使用按钮超类网格方法处理Tkinter旧样式类。但你似乎不需要这样做:
a.grid(master.self,row=0,column=0,rowspan=1,columnspan=1,sticky='wens')
做:
a = Button(master, text = "DOMINATE!", command = difficulty).grid(row=0,column=0,rowspan=1,columnspan=1,sticky='wens')
“a”将不是稍后可调用的按钮实例,因为它将是等于NoneType的网格实例。
将创建和放置分开。一目了然,尝试将
按钮.grid(
的所有实例替换为按钮(
作为一般经验法则。如果您发现自己重复类似的行3次或更多次,请使用循环。@JoelCornett--这将是一个有点笨重的循环(每次迭代时必须更改文本
,命令
,行
和列
).并不是说这不可能,但我不确定这是否能让代码更清晰…@mgilson:也许你是对的。对不起。对重复代码的下意识反应。我一直在考虑使用一系列函数来替换一系列类似的if..elifs。在这种情况下,你可以将按钮数据存储在一个数据结构中,然后在e数据结构来创建按钮。mainloop
设计为只调用一次。我无法想象您的代码如何按照您的问题中的方式运行。感谢您帮助我解决此问题并解决问题。我将采用您的GUI编程组织方法并加以应用。再次感谢!“这将是一个网格实例”是不正确的术语。它不是网格实例,而是网格函数返回的值。