Python tkinter标签在函数开始时不会改变。

3
我正在使用Python中的tkinter创建用户界面,用于将Excel文件转换为CSV格式。我创建了一个标签作为状态栏,并将statusBarText设置为StringVar(),作为文本变量。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语句中,它可以正常工作,但出现在函数顶部时,它就无法改变。非常感谢您的帮助。

不要在子进程中使用shell=True。 - nosklo
2个回答

11

由于您在单个方法调用中完成所有操作,GUI在启动子进程之前没有机会更新。请查看update_idletasks()的调用...

来自http://infohost.nmt.edu/tcc/help/pubs/tkinter/universal.html

w.update_idletasks() 更新显示的一些任务(例如调整大小和重绘小部件)被称为空闲任务,因为它们通常推迟到应用程序完成事件处理并返回主循环等待新事件时才执行。
如果您想在应用程序下一次处于空闲状态之前强制更新显示,请对任何小部件调用w.update_idletasks()方法。


嗨,由于某些原因,这似乎只能在第一次运行时起作用,但在下一次“更新”中,w.update_ideltasks()似乎无法正常工作。我应该在哪里插入这段代码?谢谢。 - Jona

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()"吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接