【问题标题】:Logging the name of a tkinter Variable记录 tkinter 变量的名称
【发布时间】:2024-04-23 20:50:01
【问题描述】:

我正在向我的 tkinter 应用程序添加一些日志记录功能。理想情况下,该函数将告诉它更改的变量的名称和更改为的值。下面是相关代码。

这声明了我正在使用的实例变量:

## priorityLevel
self.rbPriorityValue          = StringVar()
self.rbPriority               = None
self.rbMinor                  = None

这设置了一切的值:

self.rbPriority = ttk.Radiobutton(cf, text="Priority", variable=self.rbPriorityValue, value="priority",
                                  command=lambda: self.rbValueChanged(self.rbPriorityValue, self.rbPriority))
self.rbPriority.grid(row=21, column=0, sticky="w", padx=(indent, 0))
self.rbMinor = ttk.Radiobutton(cf, text="Minor", variable=self.rbPriorityValue, value="minor",
                               command=lambda: self.rbValueChanged(self.rbPriorityValue, self.rbMinor))
self.rbMinor.grid(row=22, column=0, sticky="w", padx=(indent, 0))

这是日志功能:

def rbValueChanged(self, radioValue, modifiedWidget):
    print("The value of %s is:" % radioValue.__str__(), end="\t\t")
    print(modifiedWidget.cget("value"))
#end rbValueChanged

当我选择单选按钮时,日志记录功能会打印“PY_VAR25”而不是“rbPriorityValue”。有什么办法可以退货,还是我能得到最好的 PY_VAR25?

【问题讨论】:

  • StringVar 无法知道您使用什么名称来引用它。您可以在创建 var 时传递 name= 参数以覆盖其自动生成的名称,但请注意,为每个 var 指定不同的名称完全是您的责任 - 意外重复名称不会产生任何错误消息。
  • 如果StringVar不知道,那么StringVar所属的对象不应该知道吗?
  • 您或许可以使用trace 来监听您的变量并触发日志记录。
  • 什么是跟踪,在这种情况下我将如何使用它?

标签: python-3.x logging tkinter


【解决方案1】:

您可以在 tkinter Variable 类对象上使用 name kwarg。

a_variable = StringVar(name="variable A")

这是一个简短的例子,展示了它用于获得更易读的日志:

import tkinter as tk
import logging

logging.basicConfig(level=logging.DEBUG)

def button_press(var):
    log_entry = f'variable name: {var}, value: {var.get()}'
    logging.debug(log_entry)
    # print(log_entry)


root = tk.Tk()

a_variable = tk.StringVar(value='A', name="variable A")
tk.Button(text='press A', command=lambda var=a_variable: button_press(var)).pack()

b_variable = tk.StringVar(value='B', name="variable B")
tk.Button(text='press B', command=lambda var=b_variable: button_press(var)).pack()

root.mainloop()

输出:

按A:DEBUG:root:variable name: variable A, value: A
按B:DEBUG:root:variable name: variable B, value: B

【讨论】: