【问题标题】:Set Tkinter Label Text from SharedCtypes array从 SharedCtypes 数组设置 Tkinter 标签文本
【发布时间】:2017-11-04 20:23:49
【问题描述】:

好的,我有一些多进程代码,我尝试监视程序中某个数组的值。我做了一些研究,但仍然没有找到任何解决方案,这是我的代码

from tkinter import *
from tkinter.ttk import *
import multiprocessing as mp
from multiprocessing.sharedctypes import Array
import time

class Form:
    def __init__(self, timer):  
        window = Tk()
        window.wm_title('Multiprocess Monitor')

        tvar = StringVar()
        tvar.set(timer)

        ArrayStat = Label(window, textvariable = tvar)

        window.loop()

def Countdown(timer):
    while True:
        for i,v in enumerate(timer):
            timer[i] = v-1
        time.sleep(1)

if __name__ == '__main__':
    timer = Array('i',[-1,-1,-1,-1])
    Ptimer = mp.Process(target = Countdown, args=(timer,))
    Ptimer.daemon = True
    Ptimer.start()

    app = Form(timer)

    Ptimer.join()

打印 sharedctypes 数组的常规方法是 print(timer[:])。但是如果在 tvar => tvar.set(timer[:]) 中使用这种方式,我的 GUI 不会更新标签中的文本。如果我使用 tvar.set(timer) ,标签将显示 有没有可能的解决方案?谢谢

【问题讨论】:

  • 帮助............

标签: python arrays tkinter python-multiprocessing


【解决方案1】:
from tkinter import *
from tkinter.ttk import *
import multiprocessing as mp
from multiprocessing.sharedctypes import Array
import time

class Form(Tk):
    def __init__(self):
        Tk.__init__(self)
        self.title('Multiprocess Monitor')
        self.ArrayStat = Label(self, text="test")
        self.ArrayStat.pack()

        self.after(10, self.update_label)

    def update_label(self):
        self.ArrayStat.configure(text=timer[:])
        self.after(10, self.update_label)

def Countdown(timer):
    while True:
        for i,v in enumerate(timer):
            timer[i] = v-1
        time.sleep(1)

if __name__ == '__main__':
    app = Form()
    timer = Array('i',[-1,-1,-1,-1])
    Ptimer = mp.Process(target = Countdown, args=(timer,))
    Ptimer.daemon = True
    Ptimer.start()

    app.mainloop()

    Ptimer.join()

您发布的代码甚至无法运行、未声明的变量等。 你也没有打包/网格化/放置你的标签,所以什么都不会出现。 因为不能序列化 tkinter 窗口以在进程之间传递,所以不能直接调用标签的更新,但是 after 循环可以继续检查两个进程之间共享的计时器变量的值。 在构造函数中调用mainloop 也是不好的做法,所以我将它移到了if __name__ == '__main__' 块中。

【讨论】:

  • 哇,感谢您的回答、解释和更正。在我的问题中发布的我从我的真实代码的某些部分复制粘贴并将其放置在这里,我忘记了一些细节..我永远不知道“配置”和“之后”,我应该为这两种语法搜索什么关键字?
  • 您可以传递给配置的参数会因使用的小部件而异,但通常您在创建小部件时传递的任何参数(除了父小部件)都可以传递给configure创建小部件后更改的功能。之后,请参见此处:effbot.org/tkinterbook/widget.htm#Tkinter.Widget.after-method
猜你喜欢
  • 1970-01-01
  • 2020-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
相关资源
最近更新 更多