我正在使用tkinter和Python为将Excel文件转换为CSV的程序创建用户界面。
我创建了一个标签作为状态栏,并将statusBarText设置为StringVar()作为textvariable。 inputFileEntry和outputFileEntry是包含输入和输出文件路径的文本变量。
def convertButtonClick():
statusBarText.set('Converting...')
if inputFileEntry.get() == '' or outputFileEntry.get() == '':
statusBarText.set('Invalid Parameters.')
return
retcode = subprocess.('Program.exe' ,shell=true)
if retcode == 0:
statusBarText.set('Conversion Successful!')
else:
statusBarText.set('Conversion Failed!')
单击转换按钮时会调用此函数,一切正常,但状态栏永远不会更改为“转换...”。
如果输入或输出为空,状态栏文本将更改为无效参数,并且根据返回代码将更改为成功或失败。问题是它永远不会改变为“转换......”
我已经将那条确切的行复制并粘贴到if语句中,并且它工作正常,但由于某种原因,它只是在子进程运行之前永远不会更改它位于函数顶部。任何帮助将不胜感激。
答案 0 :(得分:10)
由于您在单个方法调用中执行所有这些操作,因此在启动子进程之前,GUI永远不会有机会更新。查看update_idletasks()调用...
来自http://infohost.nmt.edu/tcc/help/pubs/tkinter/universal.html
<强> w.update_idletasks()
强>
更新显示的某些任务(例如调整大小和重绘小部件)称为空闲任务,因为它们通常会延迟到应用程序完成处理事件并返回主循环以等待新事件。
如果要在应用程序下次空闲之前强制更新显示,请在任何小部件上调用w.update_idletasks()方法。
答案 1 :(得分:3)
您是如何创建标签的? 我有这个小小的测试设置:
from Tkinter import *
class LabelTest:
def __init__(self, master):
self.test = StringVar()
self.button = Button(master, text="Change Label", command=self.change)
self.button.grid(row=0, column=0, sticky=W)
self.test.set("spam")
self.testlabel = Label(master, textvariable = self.test).grid(row = 0,column = 1)
def change(self):
self.test.set("eggs")
root = Tk()
root.title("Label tester")
calc = LabelTest(root)
root.mainloop()
它有效。 你确定使用“textvariable = StatusBarText”而不是“text = StatusBarText.get()”吗?