【发布时间】:2016-12-23 10:31:00
【问题描述】:
使用 Python 3.5。我有一个tkinter 表格。用户单击按钮将许多文件导入Listbox。另一个按钮循环遍历文件并从中读取和提取数据。
我在表单上有一个Label,表示循环的状态。在大多数情况下,该状态按预期工作,只是在末尾添加了额外的字符。我不知道这些字符是从哪里来的。我也将print() 与Label 相同的内容返回到屏幕,而print() 显示的正是它应该显示的内容。
我的问题是为什么我的Label 没有显示正确的字符串?
我的代码,大大缩短了:
class tk_new_db:
def __init__(self, master):
self.master = master # sets 'root' to the instance variable 'master'
self.var_text_2 = StringVar()
self.var_text_2.set('STATUS: Active')
self.label_6 = Label(master, textvariable=self.var_text_2,
font=self.font_10)
self.label_6.grid(row=15, sticky=W, padx=15)
def execute_main(self): # extract data from files
file_num = 0
nf = len(self.listbox_1.get(0, END))
for fr in li:
file_num += 1
print('STATUS: Extracting Loads from File '
'{} in {}'.format(file_num, nf))
self.var_text_2.set('STATUS: Extracting Loads from File '
'{} in {}'.format(file_num, nf))
self.master.update_idletasks()
print() 正在写以下内容:
STATUS: Extracting Loads from File 1 in 5
Label 正在写以下内容:
STATUS: Extracting Loads from File 1 in 5 nce...
它总是在表单上添加' nce...'。
编辑:
我确实在程序的前面使用了self.var_text_2。 ' nce...' 看起来像是前一个字符串的片段。从那以后,我尝试以两种不同的方式重置变量,但我仍然得到相同的结果。
self.var_text_2.set('STATUS: Checking .F06 Files for Convergence...')
self.master.update_idletasks()
self.var_text_2.__del__()
self.var_text_2.set('STATUS: Checking .F06 Files for Convergence...')
self.master.update_idletasks()
self.var_text_2.set('')
如何正确删除StringVar() 以供重复使用?
【问题讨论】:
-
也许在此之前有一些文本以 'nce' 结尾。您可以在更改标签文本后尝试
self.master.update_idletasks(),看看是否修复。 -
没有特殊的方法可以清除
StringVar。每次调用其set()方法时,作为参数传递的值将完全替换它之前的任何值(并且将其设置为textvariable选项的任何Label实例的文本将自动更新)。像StringVar这样的变量类都有一个trace()方法——这(解释得很差)here——你可以通过安排每次改变它的值时调用的东西来发现正在发生的事情. -
我读过的所有地方都建议不要使用
update(),但是,它实际上可以正确更新标签。我不知道为什么update_idletasks()不能正常工作。我的情况似乎很基本。 -
这是一个多线程程序吗?大多数 GUI,我认为这包括 tk,都不是线程安全的。您只能从主线程更改小部件的状态。如果您尝试,可能会发生一些非常奇怪的事情。