python如何做到实时更新窗口显示文本

例如在这个程序中,我的本意是点击开始后,以一秒钟间隔,依次在窗口中显示1-9,但在实际操作中,窗口内容更新要等到循环结束,有什么简单的方式能实现窗口实时更新吗?


import PySimpleGUI as sg
import time
layout = [
    [sg.Text("无",key="111")],
    [sg.Button("开始")]
]
windows = sg.Window("我的程序", layout)
while True:
    event, values = windows.read()    #  读取窗口,返回两个值,一个是事件,一个是值
    if event is None:
        break
    if event.endswith("开始"):
#点击开始按键后,使窗口依次显示1-9.
        for i in range(1,10):
            windows["111"].update(value=i)
            time.sleep(1)
windows.close()

窗口内容的实时更新被阻塞在 time.sleep(1) 中,导致窗口显示的是循环结束后的最终结果。为了实现窗口内容的实时更新,你可以使用多线程来分离更新窗口内容的操作。

import PySimpleGUI as sg
import threading
import time

def update_window_content(window):
    for i in range(1, 10):
        window["111"].update(value=i)
        time.sleep(1)

layout = [
    [sg.Text("无", key="111")],
    [sg.Button("开始")]
]
window = sg.Window("我的程序", layout)

while True:
    event, values = window.read()
    if event is None:
        break
    if event.endswith("开始"):
        # 创建并启动线程来更新窗口内容
        thread = threading.Thread(target=update_window_content, args=(window,))
        thread.start()

window.close()

搜“PySimpleGUI”的官方例子代码。

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/175803
  • 这篇博客也不错, 你可以看下Python编写程序,生成一个整型列表,输出包含原列表中所有元素的新列表、包含原列表中所有元素的逆序列表,以及输出具有偶数位置的元素列表。
  • 你还可以看下python参考手册中的 python- 定义扩展类型:已分类主题- 终结和内存释放
  • 除此之外, 这篇博客: Python删除文件中重复的内容中的 1.背景:在将多个文件进行合并时,存在一个问题是许多文件中含有相同的内容,但是希望合并后的文件内容具有唯一性,即文件中的数据唯一,不会有重复的情况 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  •  
    • 您还可以看一下 jeevan老师的Python量化交易,大操手量化投资系列课程之内功修炼篇课程中的 讲师简介,量化交易介绍及自动化交易演示小节, 巩固相关知识点
    • 以下回答由chatgpt基于相关博客总结生成:

      问题回答:

      可以使用Python中的多线程或异步IO来实现窗口文本的实时更新。下面是一个使用Python多线程实现窗口文本实时更新的例子:

      import tkinter as tk
      import threading
      import time
      
      class MainWindow(tk.Frame):
          def __init__(self, master=None):
              tk.Frame.__init__(self, master)
              self.pack()
              self.createWidgets()
      
          def createWidgets(self):
              self.label = tk.Label(self, text="")
              self.label.pack()
              self.startButton = tk.Button(self, text="开始", command=self.startLoop)
              self.startButton.pack()
              self.stopButton = tk.Button(self, text="停止", command=self.stopLoop)
              self.stopButton.pack()
      
          def startLoop(self):
              self.looping = True
              self.updateLabelThread = threading.Thread(target=self.updateLabel)
              self.updateLabelThread.start()
      
          def stopLoop(self):
              self.looping = False
              self.updateLabelThread.join()
      
          def updateLabel(self):
              i = 1
              while self.looping:
                  self.label.config(text=str(i))
                  i = (i % 9) + 1
                  time.sleep(1)
      
      app = MainWindow()
      app.mainloop()
      

      这个例子中,我们使用tkinter模块创建了一个窗口,包含一个文本标签和两个按钮。点击开始按钮后,开启一个子线程进行计数循环,每秒钟更新一次文本标签。点击停止按钮后,停止计数循环。

      在循环过程中,我们需要使用self.label.config(text=str(i))来更新窗口文本的内容。这里使用了tkinter的文本标签控件的config方法来修改文本标签的内容。

      需要注意的是,在开启子线程进行循环之前,我们需要在类的__init__方法中创建一个计数循环的标志self.looping,设置为False。当点击停止按钮后,我们将这个标志设置为False,循环会随之退出。

      至于在循环运行时如何持续更新窗口文本,是因为我们直接在子线程中不断地进行文本标签更新。这个更新不会影响主线程,因此循环运行时主线程依然可以响应其它事件。

      如有需要,可以对此代码进行修改以满足实际需求。

      总的来说,使用多线程或异步IO,都可以实现窗口文本实时更新。具体实现方法可以根据应用场景进行选择。

      参考资料:

      • Python 多线程编程:https://www.runoob.com/python3/python3-multithreading.html
      • Python GUI编程(Tkinter)教程:http://www.runoob.com/w3cnote/python-gui-tkinter.html