【问题标题】:Python prints { } instead of an empty space - tkinterPython 打印 { } 而不是空格 - tkinter
【发布时间】:2023-03-26 18:30:01
【问题描述】:

在这个简单的例子中,我希望标签显示为“1 3”:

import tkinter

window = tkinter.Tk()

A = [1," ", 3]

label = tkinter.Label(window, text = A[0:])
label.pack()

window.mainloop()

但是,python 显示的是“1 { } 3”。

问题出在哪里?

【问题讨论】:

  • 为什么没有得到 "[1, ' ', 3]"?
  • @LaurentLAPORTE:因为底层 tkinter 是一个 tcl 解释器,并且 tcl 对待列表的方式与 python 不同。花括号表示您所看到的是转换为字符串的列表的 tcl 表示形式,其中转换是由 tcl 而不是 python 完成的。

标签: python python-3.x tkinter label


【解决方案1】:

正如 jonathan 和 Ron Norris 已经说过的,您需要将一个字符串传递给 Label 构造函数的 text 参数。

我建议将您的异构列表转换为字符串:

A = [1," ", 3]
labeltext = ''.join(map(str, A))
label = tkinter.Label(window, text = labeltext)

编辑:由于您现在要求在许多代码位置执行此操作,且代码更改最少,因此我建议在 tkinter.Label 周围使用此包装器:

def createlabel(*args, **kwargs):
    if 'text' in kwargs and isinstance(kwargs['text'], list):
        kwargs['text'] = ''.join(map(str, kwargs['text']))
    return tkinter.Label(*args, **kwargs)

这个函数会将其所有参数原封不动地传递给tkinter.Label,但如果它是一个列表,请注意将text 关键字参数转换为字符串。

定义完后,在编辑器中使用“查找和替换”功能将对tkinter.Label 的调用替换为createlabel

您的原件可以这样转换,例如:

import tkinter

def createlabel(*args, **kwargs):
    if 'text' in kwargs and isinstance(kwargs['text'], list):
        kwargs['text'] = ''.join(map(str, kwargs['text']))
    return tkinter.Label(*args, **kwargs)

window = tkinter.Tk()

A = [1," ", 3]

label = createlabel(window, text = A[0:])
label.pack()

window.mainloop()

【讨论】:

  • 正如我在上面评论的那样,在原始程序中,我实际上有 71 个不同的列表和标签......有没有替代方法我不需要这 71 次?
  • @JindraKocman 我通过 answer 编辑提供了一种在许多代码位置轻松执行此操作的方法(通过使用函数和 Find&Replace)
【解决方案2】:

A[0:] 是一个异构列表,tkinter.Label 的文档表明它的text 参数应该接收一个字符串(“文本”这个词也非常强烈地暗示) https://docs.python.org/3/library/tkinter.ttk.html#label-options

【讨论】:

    【解决方案3】:

    如果您想要“1 3”,请尝试:

    A = [1," ", 3]
    s = ''
    for c in A:
        s += str(c)
    
    label = tkinter.Label(window, text = s)
    

    【讨论】:

    • 这行得通,但是,在我的原始程序中,我有 71 个列表,这些列表显示在 71 个标签中,写这 71 次会很痛苦......还有其他选择吗?
    • 你把重复的操作变成了函数。因此,当您创建标签时,它们都经过相同的逻辑。
    猜你喜欢
    • 1970-01-01
    • 2017-11-18
    • 2021-11-27
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2019-08-31
    • 2016-09-05
    • 1970-01-01
    相关资源
    最近更新 更多