【问题标题】:Label and value display标签和数值显示
【发布时间】:2015-04-01 21:20:27
【问题描述】:

我正在使用一个简单的代码来显示标签中数字的平方根,但由于某种原因,这些值会以一种我无法避免的方式重叠,这意味着,如果我将它用于一个具有精确平方根的数字,那么答案就会与之前的许多数字的答案混淆。

到目前为止,我一直在使用下一个代码:

from Tkinter import *

def square_calc():
    x = x_val.get()
    sqx = x ** 0.5
    print x, "** 0.5 =", sqx
    sqx_txt = Label(root, text = "x ** 0.5 =").grid(row=3, column=0)
    sqx_lab = Label(root, text = sqx).grid(row=3, column=1)

root = Tk()
root.title("Calculating square root")

x_val = DoubleVar()

x_lab   = Label(root, text = "x").grid(row=0, column=0)
nmb     = Entry(root, textvariable = x_val).grid(row=0, column=1)
calc    = Button(root, text = "Calculate", command=square_calc).grid(columnspan=2)
y_lab   = Label(root, text = " ").grid(row=3, column=0)

root.mainloop()

【问题讨论】:

  • 你想做什么?你想对数字进行四舍五入吗?
  • 好吧,我想要的是程序删除以前的答案,而不是仅仅重叠新的答案。
  • 您是在问如何删除标签?
  • 有可能,如果没有别的办法,那么这种情况的可能性更大,虽然,我不知道该怎么做
  • 您可以使用grid_forget()grid 中删除放置的小部件,但这里真正需要的是一个简单的config()

标签: python python-2.7 tkinter


【解决方案1】:

问题在于,每次调用square_calc(),您只是在创建并放置另一个Label。正确的做法是在函数外部创建一个Label,然后让函数用mylabel.config(text='new text') 更新Label 的文本。

【讨论】:

    【解决方案2】:

    显示变得一团糟,因为每次调用您的 square_calc() 函数时,它都会创建一对新的 Labels,但这可能会使之前的某些部分可见。由于左侧的文本每次都相同,因此不会引起注意,但第 1 列右侧的文本每次都可能不同。

    解决此问题的一种简单方法是将Label 设为全局变量并在函数外部创建它,然后在函数中更改其内容。与所有 Tkinter 小部件一样,这可以在创建后通过调用现有 obj 的 config() 方法来完成。

    这是您的代码的最小修改版本,说明了这样做。请注意,它还在grid() 方法调用中添加了一个sticky 关键字参数,以使标签在网格单元格内左对齐,以便它更靠近紧靠其左侧的文本标签(否则它将居中对齐)单元格)。

    from Tkinter import *
    
    def square_calc():
        x = x_val.get()
        sqx = x ** 0.5
    #    print x, "** 0.5 =", sqx
        sqx_txt = Label(root, text = "x ** 0.5 =").grid(row=3, column=0)
        sqx_lab.config(text=sqx)
        sqx_lab.grid(row=3, column=1, sticky=W)
    
    root = Tk()
    root.title("Calculating square root")
    
    x_val = DoubleVar()
    
    x_lab   = Label(root, text = "x").grid(row=0, column=0)
    nmb     = Entry(root, textvariable = x_val).grid(row=0, column=1)
    calc    = Button(root, text = "Calculate", command=square_calc).grid(columnspan=2)
    y_lab   = Label(root, text = " ").grid(row=3, column=0)
    sqx_lab = Label(root, text = " ")
    
    root.mainloop()
    

    您的代码中还有另一个潜在的严重缺陷。表单的所有这些分配

    variable = Widget(...).grid(...)
    

    导致将值 None 分配给变量,因为这是 grid() 方法返回的内容。我没有修复它们,因为它们在这个原因中没有任何危害,因为这些变量都没有被再次引用,但是如果新的全局变量 sqx_lab 已经这样做了,因为它在其他地方被引用,那将是一个问题。

    【讨论】:

    • 这样的答案迫使读者逐行寻找差异。如果您添加一些关于主要问题的解释,您的答案会好得多。例如,虽然切换到基于类的解决方案是个好建议,但它与问题完全无关,但初学者可能不会知道。
    • @Bryan:点了,但是现在考虑到其他答案,它大多是多余的。
    • 首先,非常感谢您的解释。我正在尝试“配置”选项,但我得到:“Tkinter 回调回溯中的异常(最近一次调用最后一次):文件“C:\Python27\lib\lib-tk\Tkinter.py”,第 1532 行,在 call return self.func(*args) File "C:\Users\user03\Desktop\Python\square_root_tk_fail.py",第 7 行,在 square_calc sqx_lab["text"] = str(sqx) 中。 .. TypeError: 'NoneType' 对象不支持项目分配";这也是你提到的代码中的一个缺陷,无论如何,我想我需要更多的经验才能弄清楚如何使用类。
    • 不客气。使用 Tkinter 很困难,因为它没有很好的文档记录并且有些古怪(在我看来)。无论如何,学习使用类是非常有价值的目标(双关语;-),不仅仅是为了处理 Tkinter,而且因为这些概念几乎可以在任何地方使用来改进您开发的软件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多