Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Tkinter进行Python GUI编程_Python_User Interface_Button_Tkinter - Fatal编程技术网

使用Tkinter进行Python 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 =

所以我正在创建一个游戏,现在我决定添加一个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 = 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编程组织方法并加以应用。再次感谢!“这将是一个网格实例”是不正确的术语。它不是网格实例,而是网格函数返回的值。