python tkinter灵活修改控件属性的问题
本帖最后由 cqwcns 于 2022-3-24 11:52 编辑以下Demo中,我创建了一个函数change_attribute来修改控件的属性,传参3个,分别是控件名、属性名、值。
以下代码,已经实现属性名、值的灵活调用。问题在于控件名不知道如何写如表达式。
请指教,谢谢。
from tkinter import *
from tkinter.ttk import *
class start_gui(Tk):
def __init__(self, parent):
self.parent = parent
def set_window(self):
w = self.parent
# 创建内容容器
content = Frame(w, padding=(30, 20, 30, 20))
content.grid(column=0, row=0, sticky=(N, S, E, W))
# 创建label
self.lab1 = Label(content, text='文本')
self.lab1.grid(column=0, row=0)
btn1 = Button(content, text='修改',
command=lambda: self.change_attribute('lab1', 'text', '新值1'))
btn1.grid(column=1, row=0)
self.lab2 = Label(content, text='文本2')
self.lab2.grid(column=0, row=1)
btn2 = Button(content, text='修改',
command=lambda: self.change_attribute('lab2', 'text', '新值2'))
btn2.grid(column=1, row=1)
def change_attribute(self, widget, attr, val):
print(widget)
print(attr)
print(val)
# 问题在这里
self.lab1 = val
# 尝试这样报错
# self = val
def action():
root = Tk()
window = start_gui(root)
window.set_window()
root.mainloop()
if __name__ == '__main__':
action()
本帖最后由 jandyx 于 2022-3-24 13:16 编辑
self.lab1.config(text='新值')
config可以配置属性;函数接收值,在函数里使用就行,不用把控件和属性一并传过去呀~ jandyx 发表于 2022-3-24 13:07
self.lab1.config(text='新值')
config可以配置属性;函数接收值,在函数里使用就行,不用把控件和属性一 ...
这样就写死控件名了,起不是每个控件修改属性都要单独写一个函数? cqwcns 发表于 2022-3-24 13:20
这样就写死控件名了,起不是每个控件修改属性都要单独写一个函数?
我希望实现的是一个函数,可以修改全部控件。 cqwcns 发表于 2022-3-24 13:21
我希望实现的是一个函数,可以修改全部控件。
一个button可以修改2个label,或者多个,是看你button绑定的函数要做到哪些功能,一个函数里面,你想改控件属性,直接 控件.config(属性=值) 新人来学习一下 这个思路试试是否可行:
labs=locals()
x是动态的
labs["lab%s"%x]=tk.Button(window,......)
labs["lab%s"%x].pack()
不知道我是不是正确理解了你的需求,这个方法是否可行我也没试验过。
仅供参考吧
各位大佬的回复我都没有领悟。
但自己想到了一个笨办法,就是传参时把控件直接传过去,测试了一下,功能实现。
from tkinter import *
from tkinter.ttk import *
class start_gui(Tk):
def __init__(self, parent):
self.parent = parent
def set_window(self):
w = self.parent
# 创建内容容器
content = Frame(w, padding=(30, 20, 30, 20))
content.grid(column=0, row=0, sticky=(N, S, E, W))
# 创建label
self.lab1 = Label(content, text='文本')
self.lab1.grid(column=0, row=0)
btn1 = Button(content, text='修改',
command=lambda: self.change_attribute(self.lab1, 'text', '新值1'))
btn1.grid(column=1, row=0)
self.lab2 = Label(content, text='文本2')
self.lab2.grid(column=0, row=1)
btn2 = Button(content, text='修改',
command=lambda: self.change_attribute(self.lab2, 'text', '新值2'))
btn2.grid(column=1, row=1)
def change_attribute(self, widget, attr, val):
print(widget)
print(attr)
print(val)
widget = val
def action():
root = Tk()
window = start_gui(root)
window.set_window()
root.mainloop()
if __name__ == '__main__':
action()
getattr(self, widget) = val
页:
[1]