例如在这个程序中,我的本意是点击开始后,以一秒钟间隔,依次在窗口中显示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
|