吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1494|回复: 9
收起左侧

[求助] python tkinter灵活修改控件属性的问题

  [复制链接]
cqwcns 发表于 2022-3-24 11:40
本帖最后由 cqwcns 于 2022-3-24 11:52 编辑

以下Demo中,我创建了一个函数change_attribute来修改控件的属性,传参3个,分别是控件名、属性名、值。
以下代码,已经实现属性名、值的灵活调用。问题在于控件名不知道如何写如表达式。


请指教,谢谢。

[Python] 纯文本查看 复制代码
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[attr] = val
        # 尝试这样报错
        # self[widget][attr] = val


def action():
    root = Tk()
    window = start_gui(root)
    window.set_window()
    root.mainloop()


if __name__ == '__main__':
    action()


微信图片_20220324115108.png

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

jandyx 发表于 2022-3-24 13:07
本帖最后由 jandyx 于 2022-3-24 13:16 编辑

self.lab1.config(text='新值')
config可以配置属性;函数接收值,在函数里使用就行,不用把控件和属性一并传过去呀~
 楼主| cqwcns 发表于 2022-3-24 13:20
jandyx 发表于 2022-3-24 13:07
self.lab1.config(text='新值')
config可以配置属性;函数接收值,在函数里使用就行,不用把控件和属性一 ...

这样就写死控件名了,起不是每个控件修改属性都要单独写一个函数?
 楼主| cqwcns 发表于 2022-3-24 13:21
cqwcns 发表于 2022-3-24 13:20
这样就写死控件名了,起不是每个控件修改属性都要单独写一个函数?

我希望实现的是一个函数,可以修改全部控件。
jandyx 发表于 2022-3-24 13:35
cqwcns 发表于 2022-3-24 13:21
我希望实现的是一个函数,可以修改全部控件。

一个button可以修改2个label,或者多个,是看你button绑定的函数要做到哪些功能,一个函数里面,你想改控件属性,直接 控件.config(属性=值)
userlib 发表于 2022-3-24 14:52
新人来学习一下
大方 发表于 2022-3-24 14:58
这个思路试试是否可行:

labs=locals()

x是动态的
labs["lab%s"%x]=tk.Button(window,......)
labs["lab%s"%x].pack()

不知道我是不是正确理解了你的需求,这个方法是否可行我也没试验过。
仅供参考吧

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
cqwcns + 1 + 1 谢谢@Thanks!

查看全部评分

 楼主| cqwcns 发表于 2022-3-24 16:24
各位大佬的回复我都没有领悟。
但自己想到了一个笨办法,就是传参时把控件直接传过去,测试了一下,功能实现。


[Python] 纯文本查看 复制代码
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[attr] = val


def action():
    root = Tk()
    window = start_gui(root)
    window.set_window()
    root.mainloop()


if __name__ == '__main__':
    action()
ufo0033 发表于 2022-3-24 18:07
getattr(self, widget)[attr] = val

免费评分

参与人数 1吾爱币 +2 热心值 +1 收起 理由
cqwcns + 2 + 1 谢谢@Thanks!

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 15:24

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表