开发者问题收集

在运行时在 tkinter 中添加和更新新小部件

2022-03-17
828

我正在尝试使用 Python 和 Tkinter 构建 GUI 创建器,但遇到了问题。

我的问题是 如何在运行时添加\更新小部件?

例如:

  • 我已经创建了主窗口。
  • 在该主窗口中,我创建了一个名为 w_frame 的框架,其中包含一堆小部件。
  • 根据我在 w_frame 旁边的文本或条目小部件中的输入,我想更新特定的小部件。
  • 假设 w_frame 包含一个条目小部件、单选按钮、按钮和标签,所有这些都具有显示它所需的基本或主要属性。
  • 现在我想更改标签的背景颜色。
  • 简而言之,我想编写代码 label_name.property_name=value 或例如 a_label.bg=red 在文本小部件中,只要我按下应用按钮,小部件就会改变。

我在网上搜索过,但找不到所需的解决方案。还尝试使用 如何更新 tkinter 中的某个小部件 ,但根据我的输入,这不起作用。

from tkinter import *
root=Tk()
w_frame=Frame()
w_frame.pack()
def update_Frame():
    a=u_text_wid.get("1.0",END)
    b.config(a)
    root.update()
def add_wid_in_frame():
    global a,b
    a=Button(w_frame,text='heelo')
    a.pack()
    b=Label(w_frame,text='heelo')
    b.pack()
u_text_wid=Text()
u_text_wid.pack()
button1=Button(text="add",command=add_wid_in_frame)
button1.pack()
button1=Button(text="update",command=update_Frame)
button1.pack()
root.mainloop()

这导致我出现错误

unknown option "-bg="red"

注意: 我想根据用户提供的属性值更新小部件,因此它不会被硬编码到脚本中。

2个回答

您收到错误是因为您从 Text 小部件检索到的所有内容都是字符串,并且您无法直接将字符串传递给 .config 方法,您需要一个关键字,然后才能分配可以是字符串的值。

根据您的问题和对该问题的评论,我已经弄清楚了:

  • 您想从 Text 小部件运行 lable.config(bg='red')
  • 您想更改特定小部件的属性。

您可以执行以下操作:

  1. 要从 Text 小部件运行 Tkinter 代码,您可以使用:
  • getattr 方法
  • eval 方法
  1. 只需更改小部件的属性:
def update_Frame():
    global bcd
    a = u_text_wid.get("1.0", "end-1c")
    b=a.split(",")
    c=[tuple(i.split("=")) if "=" in i else i for i in b]
    d=dict(i for i in c)
    for key,value in d.items():
        bcd[key]=value
  • 我们只能使用字符串来更改此格式的属性 widget_name[key]=value

一些有用的链接:

Binge Programming
2022-03-18

对于您的情况,您可以使用 ast.literal_eval() 将 JSON 字符串转换为字典,并在 .config() 中使用该字典:

from ast import literal_eval
...
def update_Frame():
    a = u_text_wid.get("1.0", "end-1c") # don't include ending newline
    cnf = literal_eval(a) # convert JSON string to dictionary
    b.config(cnf)

JSON 字符串的示例输入:

{"fg":"yellow", "bg":"red"}

请注意,您也可以使用 json 模块来转换 JSON 字符串。

acw1668
2022-03-17