【问题标题】:Update a tkinter texvariable label during a function在函数期间更新 tkinter texvariable 标签
【发布时间】:2016-08-11 05:35:16
【问题描述】:

我正在尝试制作一个控制发光测试机的程序。 我正在使用tkinter 对GUI 进行编程,并且我制作了一个按钮来启动在机器上进行测试的功能。 该函数在机器上启动 3 个不同的测试,并且在 GUI 中有一个框 (ttk.Label(root, textvariable=x)),必须使用三个进程的结果单独更新。

当我按下按钮时,三个测试正确开始,当函数结束时,文本正确更新。但我想在函数执行期间对其进行更新,以显示每次测试的结果,直到函数结束。

我一直在寻找和尝试,但我无法在函数期间更新文本,而不是在函数结束时更新。

有人可以帮帮我吗?

这是我使用的函数的代码:

def inittest():
    if fn.initground()=='Y':
        progtext = ('Ground test has started')
        progress.set(progtext)
    elif fn.initground()=='N'
        progtext = ('Ground test has failed')
        progress.set(progtext)
    response = fn.receivedata()
    if len(response) == 1:
        progtext = (progtext + 'Data not received')
        progress.set(progtext)
    else:
        progtext = (progtext + response)
        progress.set(progtext)
    time.sleep(2)

    if fn.initisolate()=='Y':
        progtext = ('Isolate test has started')
        progress.set(progtext)
    elif fn.initisolate()=='N'
        progtext = ('Isolate test has failed')
        progress.set(progtext)
    response = fn.receivedata()
    if len(response) == 1:
        progtext = (progtext + 'Data not received')
        progress.set(progtext)
    else:
        progtext = (progtext + response)
        progress.set(progtext)
    time.sleep(2)

    if fn.initfun()=='Y':
        progtext = ('Function test has started')
        progress.set(progtext)
    elif fn.initfun()=='N'
        progtext = ('Function test has failed')
        progress.set(progtext)
    response = fn.receivedata()
    if len(response) == 1:
        progtext = (progtext + 'Data not received')
        progress.set(progtext)
    else:
        progtext = (progtext + response)
        progress.set(progtext)
    time.sleep(2)

【问题讨论】:

  • 假设进度是您的文本变量,我认为您应该使用 tkinter 的 after 命令,而不是 time.sleep()。我的理解是 sleep 会停止所有处理,包括 tkinter 更新
  • 好的,我试过用after,结果一样,即使函数没有结束textvariable标签也不会更新。
  • 打印变量以查看它们包含的内容,从 response 和 len(response) 开始。当 len(response)==0 或 fn.initground() 不等于“Y”或“N”时会发生什么?
  • 我在序列的所有过程中都打印了变量,它在命令行中打印,但直到函数结束它才会在着色器 GUI 上更新。 fn.initground()(和 initisolate() & initfun())只返回“Y”或“N”。

标签: python function tkinter label


【解决方案1】:

好的,经过长时间的尝试代码,我终于得到了有效的代码。 我在函数启动之前设置了一个全局值,并在每次测试完成后对其进行修改。在此之后,我回忆起该函数并开始第二次测试,因为我设置的全局值已更改。 这是我使用的代码。 感谢大家的帮助。

global action
action = 1

def inittest():

    global action

    if action == 1:
         def testground():
         global progtext
         if fn.initground()=='Y':
             progtext = ('Ground test has started')
             progress.set(progtext)
         elif fn.initground()=='N'
             progtext = ('Ground test has failed')
             progress.set(progtext)
         response = fn.receivedata()
         if len(response) == 1:
             progtext = (progtext + 'Data not received')
             progress.set(progtext)
         else:
             progtext = (progtext + response)
             progress.set(progtext)
         time.sleep(2)
     action = 2
     testground()
     root.after(1000, inittest)

     if action == 2:

         def testisolate():
         global progtext
         if initisolate()=='Y':
             progtext = (progtext + 'Isolate test has started')
             progress.set(progtext)
         elif fn.initisolate()=='N'
             progtext = (progtext + 'Isolate test has failed')
             progress.set(progtext)
         response = fn.receivedata()
         if len(response) == 1:
             progtext = (progtext + 'Data not received')
             progress.set(progtext)
         else:
             progtext = (progtext + response)
             progress.set(progtext)
         time.sleep(2)
     action = 3
     testisolate()
     root.after(1000, inittest)

     if action == 3:

         def testfun():
         global progtext
         if initfun()=='Y':
             progtext = (progtext + 'Function test has started')
             progress.set(progtext)
         elif fn.initfun()=='N'
             progtext = (progtext + 'Function test has failed')
             progress.set(progtext)
         response = fn.receivedata()
         if len(response) == 1:
             progtext = (progtext + 'Data not received')
             progress.set(progtext)
         else:
             progtext = (progtext + response)
             progress.set(progtext)
         time.sleep(2)
     action = 1
     testfun()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 2012-06-30
    • 2017-04-12
    • 1970-01-01
    相关资源
    最近更新 更多