【问题标题】:Python GUI Programming Using Tkinter使用 Tkinter 进行 Python GUI 编程
【发布时间】:2012-07-23 20:19:15
【问题描述】:

所以我正在创建一个游戏,现在我决定添加一个 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 行代码中的一个 sn-p。当我尝试运行它时,我得到了这个错误:

TypeError: unbound 方法 grid_configure() 必须以 Button 实例作为第一个参数调用(取而代之的是 Tk 实例)

(Python 对我来说是一种新语言,很抱歉遗漏了任何明显或愚蠢的东西。我也是编程新手)。

【问题讨论】:

  • 一目了然,尝试用 Button( 替换所有 Button.grid( 实例
  • 作为一般经验法则。如果您发现自己重复了 3 次或更多次类似的行,请使用循环。
  • @JoelCornett -- 这将是一个有点笨拙的循环(必须在每次迭代中更改 textcommandrowcolumn)。并不是说不可能,但我不确定它是否会使代码更清晰......
  • @mgilson:也许你是对的。对不起。对重复代码的下意识反应。我正在考虑使用函数的字典来替换一系列类似的 if..elifs。在这种情况下,您可以将按钮数据存储在数据结构中,并遍历数据结构以创建按钮。
  • mainloop 被设计为只被调用一次。我无法想象您的代码如何以您在问题中的方式运行。

标签: python user-interface button tkinter


【解决方案1】:

你想要这样的东西:

a = Button(master, text = "DOMINATE!", command = difficulty)
a.grid(row=...,column=...)

还有,不要这样做

a.grid(...)
a.pack(...)

在同一个小部件(或什至在同一个小部件内)上使用packgrid 可能会让您的计算机永远坐在那里,试图在两个几何管理器之间协商合理的布局。要么只使用包,要么只使用网格。

最后,您只需要最后一个mainloop()。你应该删除所有其他的——尽管如果你有 1200 行代码,我怀疑更正这些东西会引发其他错误。

【讨论】:

    【解决方案2】:

    主要错误来自'master',它不是 Button 实例:

    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 旧样式类的 Button 超类网格方法。但你似乎不需要,所以你可以这样做:

    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" 将不是以后可调用的 Button 实例,因为它将是一个等于 NoneType 的网格实例。 拆分创建和放置。

    【讨论】:

    • “它将是一个网格实例”是不正确的术语。它不会是 grid 实例,而是 grid 函数返回的值。
    【解决方案3】:

    错误“必须使用 Button 实例调用未绑定的方法 grid_configure()...”来自如下所示的行:

    a = Button.grid(...)
    

    上面所做的是尝试在Button 类上调用grid 方法,而不是在Button 类的实例上。一般来说,任何“未绑定方法”错误都意味着——您试图在类而不是实例上调用方法。

    相反,您必须先创建Button 类的实例,然后对该实例调用grid。例如:

    a = Button(...)
    a.grid(...)
    

    另外,对同一个小部件同时使用packgrid 是没有意义的。使用其中一种。如果您使用grid,则无需致电pack

    最后,mainloop 被设计为在创建所有小部件后只调用一次。

    在相关说明中,根据我的经验,如果将所有布局代码(gridpackplace)放在一起,则 GUI 代码更容易维护。对于整个应用程序,不一定要全部放在一起,但至少按包含窗口分组。例如,而不是这个:

    a = Button(...)
    a.grid(...)
    b = Button(...)
    b.grid(...)
    ...
    

    ...我建议这样做:

    a = Button(...)
    b = Button(...)
    ...
    a.grid(...)
    b.grid(...)
    

    这种代码组织方式更容易发现布局问题,例如在同一行或同一列中有多个项目等。

    【讨论】:

    • 感谢您帮助我解决此问题并清理问题。我将采用您的 GUI 编程组织方法并应用它。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 2021-03-04
    • 2013-12-13
    • 1970-01-01
    相关资源
    最近更新 更多