3

我正在使用 tkinter 和 Python 为将 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 语句中,它工作正常,但由于某种原因,它在子进程位于函数顶部时运行之前永远不会改变。任何帮助将不胜感激。

4

2 回答 2

11

由于您在单个方法调用中完成所有这些操作,因此在您启动子进程之前,GUI 永远不会有机会更新。查看 update_idletasks() 调用...

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

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

于 2009-03-30T21:16:58.173 回答
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()”吗?

于 2009-03-30T21:14:34.840 回答