【问题标题】:tkinter - mistake in the layouttkinter - 布局错误
【发布时间】:2015-05-24 19:30:10
【问题描述】:

在下面的代码中,我希望第 34 行的 label 像第 59 行的 label 一样位于我的画布顶部。但它会转到我的画布底部,即使我在两个地方都使用相同的代码。

这是我的代码(导致问题的代码标有#):

from tkinter import*
from random import*

score = 0

Fenetre = Tk()

def Clavier(event):
    global coords
    global score
    global label

    touche = event.keysym

    if touche == "Up":
        coords = (coords[0], coords[1] - 10)
    elif touche == "Down":
        coords = (coords[0], coords[1] + 10)
    elif touche == "Right":
        coords = (coords[0] + 10, coords[1])
    elif touche == "Left":
        coords = (coords[0] -10, coords[1])

    canvas.coords(eater, coords[0], coords[1], coords[0]+20, coords[1]+20)

    while canvas.bbox(eater) == canvas.bbox(food):
        canvas.delete(food)
        label.destroy()
        global food
        up_score = score
        up_score = up_score + 1
        score = up_score
        label = Label(Fenetre, text = up_score) # line 34
        label.pack()
        X=choice(liste)
        Y=choice(liste)
        food = canvas.create_rectangle(X,Y,X+20,Y+20,fill="grey")

#fond = PhotoImage(file="Moi.gif")

canvas = Canvas(Fenetre, width=189, height=189)
#canvas.create_image(0,0,image=fond,anchor = NW)

coords = (0, 0)

liste_couleur = ["green","white","red","blue","yellow","violet","orange"]
couleur = choice(liste_couleur)
eater = canvas.create_oval(0,0,20,20,fill=couleur)

canvas.focus_set()
canvas.bind("<Key>", Clavier)

liste = [10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180]
X = choice(liste)
Y = choice(liste)
food = canvas.create_rectangle(X,Y,X+20,Y+20,fill="grey")

label = Label(Fenetre, text = score) # line 59

label.pack()
canvas.pack()
Fenetre.mainloop()

如果重要的话,我使用的是 Python 3.2。

【问题讨论】:

  • 您为什么要销毁标签只是为了重新创建它并尝试将其打包回同一个地方?只更改现有标签的文本会容易得多。
  • 由于循环while,我销毁了一个标签并重新创建了另一个标签。如果我删除我的一个标签,它会因为 def 而导致类似 NameError: name 'up_score' is not definedNameError: global name 'label' is not defined 的错误。它也可能来自我,因为我做错了......
  • 我完全不明白那个解释。为什么while 循环意味着您不能只更改现有标签的文本?更改现有标签的文本对删除标签有何影响?

标签: python canvas layout tkinter label


【解决方案1】:

新标签与原始标签不同的原因是……嗯,这就是the pack geometry manager 的工作方式:某事的去向取决于您pack 它时已经存在的其他内容。原始标签被包装到一个空白空间,然后其他东西被包装在它之后,所以它最终在顶部。新标签被打包到一个已经有其他东西的空间中,所以它最终在底部。

可以通过传递side=BOTTOM 参数来解决此问题。

或者您可以使用grid 布局而不是pack 布局来确保所有内容都准确地到达您想要的位置。

但是,我认为您在此处真正想要的要简单得多:与其反复破坏标签并创建新标签并希望您可以将它们安装在同一个地方,只需保留标签并进行更改它的文字。

换句话说,不是这样:

    label.destroy()
    # other code
    label = Label(Fenetre, text = up_score) # line 34
    label.pack()

……就这样做吧:

    # other code
    label.config(text=up_score)

或者,也许更好,将StringVar 分配给Label,然后在StringVar 上调用set(如Label 文档中的倒数第二个模式所示Tkinter 书)。

【讨论】:

    猜你喜欢
    • 2013-01-06
    • 2021-10-13
    • 2022-01-01
    • 1970-01-01
    • 2021-05-31
    • 2023-03-30
    • 2017-12-24
    • 2023-04-05
    • 2013-05-11
    相关资源
    最近更新 更多