【问题标题】:Tkinter: why .grid() method giving an error?Tkinter:为什么 .grid() 方法会出错?
【发布时间】:2021-05-12 15:44:51
【问题描述】:

代码:

import tkinter as tk
import random as rd

number = rd.randint(10,51)
trial = 0
chance = 0

window = tk.Tk()
window.title("Guess")
label = tk.Label(window, text="Guess a number that can be anything from '10' to '50', you have 5 chances !!!\n", font=("Arial Bold",20)).pack()

bt = tk.Button(window, text="Enter")
bt.grid(column=3, row=3)

window.geometry('2000x1000')
window.mainloop()

错误:_tkinter.TclError: cannot use geometry manager grid inside . which already has slaves managed by pack

如果我尝试删除 'label' 中的 .pack(),文本不会加载,并且按钮仍然保持在 (0,0),而没有错误

【问题讨论】:

  • 与错误无关,但是给.pack()的结果设置变量通常是错误的。您应该将label 设置为tk.Label 对象,然后调用label.pack()
  • 添加到@Barmar 答案:如果您以后不打算使用小部件,您不妨只做Label(master, **options).pack() 而不分配变量而不是var = Label(master, **options).pack()
  • 这个错误的意思正是它所说的。 FWIW,“。”是根窗口的内部名称。

标签: python user-interface tkinter error-handling graphics


【解决方案1】:

错误很明显,你不能在容器或窗口中混合pack()grid()。在这里,您在label 上使用pack(),在btn 上使用grid()。所以将label 更改为grid()。或者把bt.grid(..)改成bt.pack()


请注意,您的labelNone,如果您打算重复使用该标签,以后可能会导致几个错误。所以理想的方式是在下一行grid()/pack()

label = tk.Label(window, text="Guess a number that can be anything from '10' to '50', you have 5 chances !!!\n", font=("Arial Bold",20))
label.pack()

如果你不打算重用它,那么就不要费心给它一个变量名。

【讨论】:

    【解决方案2】:

    你所要做的就是改变标签也使用网格而不是包,我改变了下面的行:

    label = tk.Label(window, text="Guess a number that can be anything from '10' to '50', you have 5 chances !!!\n", font=("Arial Bold",20))
    label.grid()
    

    【讨论】:

    • 为什么要将Widget().layout_manager() 分配给变量?它返回 None 所以这个变量是没有用的。
    • @Matiiss 更糟糕的是,人们可能会链接这些以节省空间,然后执行label.something 并得到一个 AttributeError。无时无刻不在发生。
    • @Reti43 是的,我也经常看到,但是如果想节省空间,为什么要写变量? (大概是因为他们不知道这是没有必要的)。在这些情况下,甚至可以使用 textvariable 属性,但这又有点过分了。
    • 我应该把网格放在第二行,就像另一个答案一样。我把它放在同一行,因为这就是 OP 的方式。我也是,在学习,没想到如果以后用 label.something 会发生什么。
    • 更改以反映来自@Matiiss 的反馈
    【解决方案3】:

    您需要使用网格或包,而不是两者。根据我的经验,这就是我的想法。

    错误:_tkinter.TclError: cannot use geometry manager grid inside 。已经有由包管理的奴隶 它说它是由包管理的,所以你需要使用包管理器“或”网格管理器

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-21
      • 1970-01-01
      • 2019-10-15
      • 1970-01-01
      • 2016-12-21
      相关资源
      最近更新 更多