tkinter-通过外部功能

时间:2019-01-28 14:33:04

标签: python user-interface tkinter

我是tkinter GUI编程的新手。我试图搜索我的问题,但是如果没有描述我的问题,我将无法提出正确的问题。

我设计了一个小的GUI(在此示例中),它带有一个按钮和ScrolledText项。

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”,该功能的主要目的是实例化外部类并运行方法。

    class_obj = ds.DoSomething(i, self.avg_log)
    for i in sel_dbs:
        class_obj.do_something()

此类包含我的软件的主要逻辑,并且包含许多打印输出。

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.insert进行打印(我不知道这是否是一种聪明的方法?!)。

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

所以我的问题是-如何使用输出字符串连续更新ScrolledText窗口?

非常感谢您。

最佳问候 迈克尔

0 个答案:

没有答案