python - 如何在 tkinter 模块中动态显示数据-Python
问题描述
我是使用 Tkinter 在 python 中创建 GUI 的新手。我在堆栈溢出中找到了一个脚本,它提供了一个 GUI,我可以在其中手动添加数据。我尝试动态添加数据,从而使用以下代码自动化整个过程:
def insert_data(self):
"""
Insertion method.
"""
for l in range(10):
time.sleep(3)
print(i)
self.treeview.insert('', 'end', text="Item_"+str(self.i)+str(l), values=(self.dose_entry.get()+" mg", self.modified_entry.get()))
# Increment counter
self.i = self.i + 1
这个插入数据片段提供了正确的输出,甚至在 GUI 中显示数据。但是在执行 for 循环后会显示在 gui 中插入的数据。更详细地说:
print(i)
在上面的 for 循环中,在 IDLE 中打印 0 到 9,但在执行期间,IDLE 中显示的数据不会同时出现在 GUI 中。它在 IDLE 中打印数据,直到循环未完成,并且 GUI 在循环完成之前不会显示任何数据,然后一次显示所有数字。
我想在 GUI 中显示数据,因为它在 IDLE 中打印,即每次迭代数据都应该在 GUI 中可见,因为它在 IDLE 中打印。示例:在 i = 0 的第一次迭代中,print(i) 将打印“0”。我想在 GUI 中显示它,因为它在 IDLE 中打印。以下是我的代码:
import tkinter
from tkinter import ttk
import urllib
import requests
import time
class Begueradj(tkinter.Frame):
'''
classdocs
'''
def __init__(self, parent):
'''
Constructor
'''
tkinter.Frame.__init__(self, parent)
self.parent=parent
self.initialize_user_interface()
def initialize_user_interface(self):
"""Draw a user interface allowing the user to type
items and insert them into the treeview
"""
self.parent.title("Canvas Test")
self.parent.grid_rowconfigure(0,weight=1)
self.parent.grid_columnconfigure(0,weight=1)
self.parent.config(background="lavender")
# Define the different GUI widgets
self.dose_label = tkinter.Label(self.parent, text = "Dose:")
self.dose_entry = tkinter.Entry(self.parent)
self.dose_label.grid(row = 0, column = 0, sticky = tkinter.W)
self.dose_entry.grid(row = 0, column = 1)
self.modified_label = tkinter.Label(self.parent, text = "Date Modified:")
self.modified_entry = tkinter.Entry(self.parent)
self.modified_label.grid(row = 1, column = 0, sticky = tkinter.W)
self.modified_entry.grid(row = 1, column = 1)
self.submit_button = tkinter.Button(self.parent, text = "Insert", command = self.insert_data)
self.submit_button.grid(row = 2, column = 1, sticky = tkinter.W)
self.exit_button = tkinter.Button(self.parent, text = "Exit", command = self.parent.quit)
self.exit_button.grid(row = 0, column = 3)
# Set the treeview
self.tree = ttk.Treeview( self.parent, columns=('Dose', 'Modification date'))
self.tree.heading('#0', text='Item')
self.tree.heading('#1', text='Dose')
self.tree.heading('#2', text='Modification Date')
self.tree.column('#1', stretch=tkinter.YES)
self.tree.column('#2', stretch=tkinter.YES)
self.tree.column('#0', stretch=tkinter.YES)
self.tree.grid(row=4, columnspan=4, sticky='nsew')
self.treeview = self.tree
# Initialize the counter
self.i = 0
def insert_data(self):
"""
Insertion method.
"""
for l in range(10):
time.sleep(3)
print(l)
self.treeview.insert('', 'end', text="Item_"+str(l), values=(self.dose_entry.get()+" mg", self.modified_entry.get()))
# Increment counter
self.i = self.i + 1
def main():
root=tkinter.Tk()
d=Begueradj(root)
root.mainloop()
if __name__=="__main__":
main()
解决方案
当您使用time.sleep(3)
执行暂停时,还会对 GUI 进行任何更新。GUI 更新任务在队列中,一旦应用程序有时间,它们就会被处理。在循环结束之前,没有时间可以闲置。
要强制更新树视图,您可以插入以下行:
self.treeview.update_idletasks() # Force widget update
添加树视图项目后。
推荐阅读
- python - 只有大小为 1 的数组可以转换为 Python 标量:尝试用方程绘制圆形轨道。圆圈
- nunit - 为什么这个 NUnit 测试没有捕捉到我的异常?
- python - 在 Google Colaboratory 上将 Request 与 NASA 数据一起使用
- amazon-web-services - 需要在 AWS 上创建一个 lamda 函数,每 1 分钟触发一次 CPU 警报并在警报高于阈值时发送 SNS 通知我的意思是警报
- reactjs - useStripe 不返回所有 API 方法
- flutter - 为什么我的代码在基于日期过滤时返回布尔值而不是显示列表的元素?
- amazon-web-services - 如何从自定义 Docker 映像中获取 Lambda 事件/上下文/有效负载?
- c++ - 在将 head 与 nullptr 进行比较时:,,Exception throw: 读取访问冲突。这是 0x20。”
- python - 使用 Phyton 以最少的硬币/纸币计算输出变化
- javascript - 带变量名的导入函数