python - 如何动态显示 tkinter 模块中的数据-Python

标签 python python-3.x user-interface tkinter

我是使用 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中插入的数据就会显示出来。更详细一点: 上面的 for 循环中的 print(i) 在 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 更新任务位于队列中,一旦应用程序有时间,它们就会被处理。并且在循环结束之前没有多余的时间。

要强制 TreeView 更新,您可以插入以下行:

self.treeview.update_idletasks()   # Force widget update

添加 TreeView 项目后。

关于python - 如何动态显示 tkinter 模块中的数据-Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53031569/

相关文章:

python - 以多列定义的频率填写分组中的缺失日期

Python yaml : ModuleNotFoundError

android - 为什么官方 Google IO 应用程序只有支持 hdpi 的可绘制对象,但在我的小型 ldpi 设备上看起来还不错?

python - 如何找到自签名证书

python - 从 Telegram 的机器人 API 获取投票结果和用户选择

python - 我在从 mongodb 查询数据并渲染到 Flask 时遇到问题

python-3.x - Pandas 列 dType 数组

python - 从机器人框架调用 Python

android - 将 include 标签与已经存在的 GridView 一起使用

c++ - 钳位到 "easy"数字