使用python和tkinter更新显示;我是否需要创建一个事件才能使 mainroot 运行?

问题描述

这是我的第一篇文章,所以请耐心等待。我有一个在模拟时间运行的离散事件模拟,当它逐步执行 sim_time 时,它​​使用 .grid 几何管理器更新 UI。它希望在没有用户事件(如鼠标点击)的情况下进行多次更新。我曾尝试使用 root.update_idletasks() 和 root.update() - 它们在一定程度上起作用,但它仍然断断续续,并且没有干净的刷新。如果我实现它,以便您必须为每个 sim_time 刻度单击一个按钮,那么它会在 mainroot() 中等待用户输入,并且一切正常。但对我来说,以编程方式进行多次更新会导致它在刷新时打嗝。

我正在考虑创建一个在单独进程中运行的计时器,并通过脉冲模拟来推进一个滴答声,但这似乎很复杂,我想有一个更简单的答案。

以下是放置在框架中的对象示例。我可能会根据正在模拟的过程中的流动情况来做很多这样的事情。

def add(self,opp):
    """ add an opp to a display frame """
    self.opps.append(opp)
    b=Button(self.f,image=opp.icon,command=lambda: self.bp_opp(opp))
    opp.button = b
    #
    #
    # note there is probably a way to get the geometry manager to do this
    #
    r = (len(self.opps) -1) // self.max_opps_per_row 
    c = (len(self.opps) - 1)  % self.max_opps_per_row
    self.o.grid()
    self.f.grid(row=1,column=0,sticky=W)
    if c <= self.max_opps_per_row:
        b.grid(row=r,column=c,sticky=W)
    return()

上面的o是一个父框架,包含框架f,f中放置了几个按钮b。 在视觉表示中,按钮从流程的一个部分流向另一部分,理想情况下,可以通过按下按钮暂停模拟并查询流程。 因此,在流程的几层执行上述版本之后,控制权传递给主股票代码并执行以下操作:

        my_ui.root.update_idletasks()
        my_ui.root.after(100)
        time.sleep(5)

现在,如果这是严格的用户事件驱动,我会让它回到 root.mainloop() 并等待下一次鼠标点击或其他什么,但我正在模拟时间,我想增加时间和另一个循环,所以 root.update_idletasks() 应该更新所有 grid() 操作。

我尝试移动网格语句,并重新排序它们以绝对确保它们按照框架和按钮的分层顺序,并且我尝试了各种形式的 root.update() 和 root.update_idletasks( )。有些比其他的工作得更好,但似乎没有一个能奏效。我想我应该创建一个周期性事件来唤醒我的模拟计时器,该事件最终将返回 root.mainloop()

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)