tkinter从外部函数在滚动文本中插入文本

2024-04-28 23:40:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我对tkinter图形用户界面编程是新手。我试图寻找我的问题,但如果没有对问题的描述,我就无法提出正确的问题。在

我设计了一个小的图形用户界面(以这里的例子为例),有一个按钮和一个滚动的文本项。在

import tkinter as tk
from tkinter import messagebox as msg
from tkinter.ttk import Notebook
from tkinter import filedialog
import tkinter.scrolledtext as tkscrolled

import do_something as ds
import os
import time

class Fatt(tk.Tk):

    def __init__(self):
        super().__init__()

        # window setup
        self.title("Test Gui")
        self.geometry("1024x768")
        self.resizable(0, 0)

        # tab
        self.notebook = Notebook(self)
        # define tabs
        res_avg_tab = tk.Frame(self.notebook)

        # group nodal averaging
        group_avg = tk.LabelFrame(res_avg_tab, text="Perform nodal averaging of all selected DB files")
        group_avg.pack(padx=10, pady=10)

        # nodal averaging button
        self.avg_button = tk.Button(group_avg, text="Perform Nodal Averaging", 
                command=self.nodal_avg, bg="lightgrey", fg="black", width=50)
        self.avg_button.pack(side=tk.TOP, pady=10, padx=10)

        # scrolled log-text window
        # group LOG
        group_log = tk.LabelFrame(res_avg_tab, text="Result Averaging Output (LOG)")
        group_log.pack(padx=10, pady=10)

        self.avg_log = tkscrolled.ScrolledText(group_log, bg="white", fg="black", height=13, width=110)
        self.avg_log.pack(side=tk.TOP, fill=tk.X, padx=10, pady=10)

        # status-bar
        self.status_text = tk.StringVar(res_avg_tab)
        self.status_text.set("---")
        self.status = tk.Label(res_avg_tab, textvar=self.status_text, 
                bd=1, relief=tk.SUNKEN, anchor=tk.W)
        self.status.pack(side=tk.BOTTOM, fill=tk.BOTH)

        # add everything to tabs
        self.notebook.add(res_avg_tab, text="Average Results")
        self.notebook.pack(fill=tk.BOTH, expand=True)

    def show_cmb_file_creator(self):
        pass

    def nodal_avg(self):
        sel_dbs = ["file1", "file2", "file3"]
        # write file-list to log-window
        self.avg_log.insert(tk.INSERT, "\nSelected Files for Nodal Averaging:\n")
        for i in sel_dbs:
            self.avg_log.insert(tk.INSERT, i+'\n')
        self.avg_log.see(tk.END)
        # if yes --> average results
        if msg.askyesno("Nodal Averaging", "Perform nodal averaging with selected db-results?"):
            start = time.time()
            self.status_text.set("processing...")
            self.config(cursor="wait")
            self.avg_log.insert(tk.INSERT, "Start nodal averaging - this may take some time...\n")
            class_obj = ds.DoSomething(i, self.avg_log)
            for i in sel_dbs:
                class_obj.do_something()
            end = time.time()
            overall_time_str = " Overall Averaging RUNTIME: {0:.2f} sec ({1:.1f} min) ".format(end-start, (end-start)/60.0)
            self.avg_log.insert(tk.INSERT, "\n{0:*^80}".format(overall_time_str))
            self.avg_log.see(tk.END)
        self.status_text.set("---")
        self.config(cursor="")

    def browse_dir(self):
        pass

    def copy_to_clipboard(self, text=None):
        pass

if __name__=="__main__":
    fatt = Fatt()
    fatt.mainloop()

“avg_button”按钮执行函数“nodal_avg”,此函数的主要目的是实例化一个外部类并运行一个方法。在

^{pr2}$

这个类包含了我的软件的主要逻辑,并且包含了很多打印输出。在

import tkinter.scrolledtext as tkscrolled

class DoSomething:
    def __init__(self, my_file, outp_print=print):
        self.my_file = my_file
        self.outp_print = outp_print

    # my-print function
    # for tkinter-log output
    def myprint(self, text):
        if self.outp_print==print:
            print(text)
        elif isinstance(self.outp_print, tkscrolled.ScrolledText):
            self.outp_print.insert("end", text+'\n')
        else:
            print("myprint - ERROR: {0}".format(str(self.outp_print)))

    def do_something(self):
        for i in range(0,100000):
            self.myprint("{0:d} - printed output".format(i))

我希望将类/方法的输出打印到ScrolledText窗口,但我也希望维护经典的打印功能。因此我使用“myprint”方法-它可以使用print或滚动文本。插入对于印刷(我不知道这是不是一个聪明的方法?!)。在

如果我运行代码,它基本上可以工作-但是ScrolledText窗口不会在每次打印时更新,只有当外部类中的方法完成时-输出才会出现。在

所以我的问题是-如何用我的输出字符串不断更新我的滚动文本窗口?在

非常感谢。在

谨致问候 迈克尔


Tags: textimportselflogtimetkinterdefstatus