Text tkinter文本小部件在显示进度条时复制

Text tkinter文本小部件在显示进度条时复制,text,tkinter,widget,duplicates,Text,Tkinter,Widget,Duplicates,我有一个通过文本小部件显示进度消息的应用程序,这样如果有很多行,它就会滚动。它还为每个单独的步骤显示一个“任务”进度条,并为总完成显示一个不同的“总”进度条 我的情况是,如果没有“内容”,我希望不显示进度条。因此,在处理的开始和结束时,它们都不存在。第一步完成后,将显示“总”进度条,如果任务足够长,将显示“任务”进度条 这是一个很大的应用程序,但这里是我拥有的一个简短版本(尽管仍然很长) #/usr/bin/python #编码=utf-8 #尝试使用较旧版本的Python 来自未来导入打印功能

我有一个通过文本小部件显示进度消息的应用程序,这样如果有很多行,它就会滚动。它还为每个单独的步骤显示一个“任务”进度条,并为总完成显示一个不同的“总”进度条

我的情况是,如果没有“内容”,我希望不显示进度条。因此,在处理的开始和结束时,它们都不存在。第一步完成后,将显示“总”进度条,如果任务足够长,将显示“任务”进度条

这是一个很大的应用程序,但这里是我拥有的一个简短版本(尽管仍然很长)

#/usr/bin/python
#编码=utf-8
#尝试使用较旧版本的Python
来自未来导入打印功能
导入系统
如果sys.version_info.major<3:
将Tkinter作为tk导入
将Tkinter.ttk导入为ttk
其他:
将tkinter作为tk导入
将tkinter.ttk导入为ttk
#============================================================================
#主类
主类(tk.框架):
“主处理
"""
定义初始化(self,root,*args,**kwargs):
tk.Frame.\uuuuu init\uuuuu(self,root,*args,**kwargs)
self.root=根
self.MW\u f=tk.Frame(self.root)
#进度消息
self.PM\u prog\u msgs\u lf\u var=tk.StringVar()
self.PM\u prog\u msgs\u lf=tk.LabelFrame(self.MW\u f,
text='进度消息:',
浮雕(下陷)
#进度消息文本小部件
self.PM\u prog\u msgs\u max\u frame\u height=6
self.PM\u prog\u msgs\u line\u count=0
self.PM\u prog\u msgs\u t=tk.Text(self.PM\u prog\u msgs\u lf,高度=self.PM\u prog\u msgs\u最大帧高度,宽度=100)
self.PM\u prog\u msgs\u t\u vbar=ttk.Scrollbar(self.PM\u prog\u msgs\u lf,
orient='vertical',command=self.PM\u prog\u msgs\u t.yview)
self.PM_prog_msgs_t['yscrollcommand']=self.PM_prog_msgs_t_vbar.set
self.PM_prog_msgs_t['state']='disabled'
self.PM_prog_msgs_t['border']=3
self.PM\u task\u progbar\u var=tk.IntVar()
self.PM\u task\u progbar=ttk.Progressbar(self.MW\u f,
“水平”方向,
模式='不确定',
变量=self.PM\u task\u progbar\u var)
self.PM\u progbar\u var=tk.IntVar()
self.PM\u progbar=ttk.Progressbar(self.MW\u f,
“水平”方向,
模式='确定',
变量=self.PM\u progbar\u var,
最大值=4)
self.PM\u go\u btn=tk.按钮(self.MW\u f,
text='Go',
命令=自我行动(执行)
self.MW_stsbar_tvar=tk.StringVar()
self.MW\u stsbar=tk.标签(self.MW\u f,
textvariable=self.MW\u stsbar\u tvar)
#网格化小部件
self.MW_f.grid()
兆瓦电网排=0
#放入微波炉
self.PM\u prog\u msgs\u lf.grid(row=MW\u grid\u row,column=0,sticky='we')
#放入PM\U prog\U msgs\U lf
self.PM\u prog\u msgs\t.grid(行=0,列=0)
self.PM\u prog\u msgs\u t\u vbar.grid(行=0,列=1,sticky='ns')
兆瓦电网排+=1
self.PM\u task\u progbar\u row=MW\u grid\u row
self.PM\u task\u progbar.grid(row=self.PM\u task\u progbar\u row,sticky='we')
兆瓦电网排+=1
self.PM\u progbar\u row=MW\u grid\u row
self.PM\u progbar.grid(row=self.PM\u progbar\u row,sticky='we')
兆瓦电网排+=1
self.MW\u stsbar.grid(row=MW\u grid\u row,sticky='w')
兆瓦电网排+=1
self.PM\u go\u btn.grid(行=MW\u grid\u行)
#取下这些直到需要
self.PM\u task\u progbar.grid\u remove()
self.PM\u progbar.grid\u remove()
self.PM_prog_msgs_t_vbar.grid_remove()
self.MW\u dsp\u stsbar\u msg('处理:有关更多详细信息,请参阅进度消息窗格')
#窗口现在显示
#=========================================================================================
#窗口使用的函数
def行动(自我):
"""
"""
msg='第1行\n第2行'
self.PM\u dsp\u prog\u msgs(msg,2)
self.PM\u task\u progbar\u update()
时间。睡眠(5)
self.PM\u progbar\u update()
自助式PM\U dsp\U prog\U msgs(第3行,第1行)
self.PM\u task\u progbar\u update()
时间。睡眠(5)
self.PM\u progbar\u update()
msg='第4行\n第5行\n第6行'
self.PM\u dsp\u prog\u msgs(msg,3)
self.PM\u task\u progbar\u update()
时间。睡眠(5)
self.PM\u progbar\u update()
msg='第7行\n第8行\n第9行'
self.PM\u dsp\u prog\u msgs(msg,3)
self.PM\u task\u progbar\u update()
时间。睡眠(5)
self.PM\u progbar\u update()
self.PM\u progbar.grid\u remove()
返回
def MW_dsp_stsbar_msg(自我,msg):
"""
"""
#显示状态栏
自置MW\U stsbar\U tvar.set(msg)
返回
def PM_dsp_prog_msgs(自身、消息、行):
"""
"""
#填充消息
self.PM_prog_msgs_t[“状态”]=“正常”
self.PM_prog_msgs_t.insert(tk.END,('\n'+msg))
self.PM_prog_msgs_t['state']='disabled'
self.root.update_idletasks()
self.PM\u prog\u msgs\u line\u count+=行
#如果其时间显示垂直滚动条
如果不是self.PM_prog_msgs_t_vbar.winfo_view():
如果self.PM\u prog\u msgs\u line\u count>self.PM\u prog\u msgs\u max\u frame\u height:
self.PM\u prog\u msgs\u t\u vbar.grid(行=0,列=1)
self.root.update_idletasks()
#显示最后一行。
self.PM\u prog\u msgs\t.见(tk.END)
self.root.update_idletasks()
返回
def PM_程序条_更新(自我):
"""
""
#!/usr/bin/python
# coding=utf-8

# Try to work with older version of Python
from __future__ import print_function

import sys

if sys.version_info.major < 3:
    import Tkinter as tk
    import Tkinter.ttk as ttk
else:
    import tkinter as tk
    import tkinter.ttk as ttk
#============================================================================
#   MAIN CLASS
class Main(tk.Frame):
    """ Main processing
    """
    def __init__(self, root, *args, **kwargs):
        tk.Frame.__init__(self, root, *args, **kwargs)

        self.root = root

        self.MW_f = tk.Frame(self.root)

        # Progress Messages
        self.PM_prog_msgs_lf_var = tk.StringVar()
        self.PM_prog_msgs_lf = tk.LabelFrame(self.MW_f,
                                             text=' Progress Messages: ',
                                             relief='sunken')

        # Progress Message text widget
        self.PM_prog_msgs_max_frame_height = 6
        self.PM_prog_msgs_line_count = 0
        self.PM_prog_msgs_t = tk.Text(self.PM_prog_msgs_lf, height=self.PM_prog_msgs_max_frame_height, width=100)
        self.PM_prog_msgs_t_vbar = ttk.Scrollbar(self.PM_prog_msgs_lf,
                                   orient='vertical', command=self.PM_prog_msgs_t.yview)
        self.PM_prog_msgs_t['yscrollcommand'] = self.PM_prog_msgs_t_vbar.set

        self.PM_prog_msgs_t['state'] = 'disabled'
        self.PM_prog_msgs_t['border'] = 3

        self.PM_task_progbar_var = tk.IntVar()
        self.PM_task_progbar = ttk.Progressbar(self.MW_f,
                                               orient='horizontal',
                                               mode='indeterminate',
                                               variable=self.PM_task_progbar_var)

        self.PM_progbar_var = tk.IntVar()
        self.PM_progbar = ttk.Progressbar(self.MW_f,
                                          orient='horizontal',
                                          mode='determinate',
                                          variable=self.PM_progbar_var,
                                          maximum=4)

        self.PM_go_btn = tk.Button(self.MW_f,
                                  text='Go',
                                  command=self.action_go_btn)

        self.MW_stsbar_tvar = tk.StringVar()
        self.MW_stsbar = tk.Label(self.MW_f,
                                  textvariable=self.MW_stsbar_tvar)

        # Grid the widgets
        self.MW_f.grid()
        MW_grid_row = 0

        # Place into MW_f
        self.PM_prog_msgs_lf.grid(row=MW_grid_row, column=0, sticky='we')
        # Place into PM_prog_msgs_lf
        self.PM_prog_msgs_t.grid(row=0, column=0)
        self.PM_prog_msgs_t_vbar.grid(row=0, column=1, sticky='ns')

        MW_grid_row += 1
        self.PM_task_progbar_row = MW_grid_row
        self.PM_task_progbar.grid(row=self.PM_task_progbar_row, sticky='we')
        MW_grid_row += 1
        self.PM_progbar_row = MW_grid_row
        self.PM_progbar.grid(row=self.PM_progbar_row, sticky='we')
        MW_grid_row += 1
        self.MW_stsbar.grid(row=MW_grid_row, sticky='w')
        MW_grid_row += 1
        self.PM_go_btn.grid(row=MW_grid_row)

        # Remove these until needed
        self.PM_task_progbar.grid_remove()
        self.PM_progbar.grid_remove()
        self.PM_prog_msgs_t_vbar.grid_remove()

        self.MW_dsp_stsbar_msg('Processing: Refer to progress message pane for more details')

#   Window Displays Now
#=========================================================================================
#   Functions used by window
    def action_go_btn(self):
        """
        """
        msg = 'Line 1\nLine 2'
        self.PM_dsp_prog_msgs(msg, 2)
        self.PM_task_progbar_update()
        time.sleep(5)
        self.PM_progbar_update()

        self.PM_dsp_prog_msgs('Line 3', 1)
        self.PM_task_progbar_update()
        time.sleep(5)
        self.PM_progbar_update()

        msg = 'Line 4\nLine 5\nLine 6'
        self.PM_dsp_prog_msgs(msg, 3)
        self.PM_task_progbar_update()
        time.sleep(5)
        self.PM_progbar_update()

        msg = 'Line 7\nLine 8\nLine 9'
        self.PM_dsp_prog_msgs(msg, 3)
        self.PM_task_progbar_update()
        time.sleep(5)
        self.PM_progbar_update()
        self.PM_progbar.grid_remove()

        return

    def MW_dsp_stsbar_msg(self, msg):
        """
        """
        # Display the statusbar
        self.MW_stsbar_tvar.set(msg)

        return

    def PM_dsp_prog_msgs(self, msg, lines):
        """
        """
        # Populate the message
        self.PM_prog_msgs_t['state'] = 'normal'
        self.PM_prog_msgs_t.insert(tk.END, ('\n'+msg))
        self.PM_prog_msgs_t['state'] = 'disabled'
        self.root.update_idletasks()

        self.PM_prog_msgs_line_count += lines

        # If its time display the vert scroll bar
        if not self.PM_prog_msgs_t_vbar.winfo_viewable():
            if self.PM_prog_msgs_line_count > self.PM_prog_msgs_max_frame_height:
                self.PM_prog_msgs_t_vbar.grid(row=0, column=1)
                self.root.update_idletasks()

        # Show the last line.
        self.PM_prog_msgs_t.see(tk.END)

        self.root.update_idletasks()

        return

    def PM_progbar_update(self):
        """
        """
        if not self.PM_progbar.winfo_viewable():
            self.PM_progbar.grid()

        # Remove the task progbar
        self.PM_task_progbar.stop()
        self.PM_task_progbar.grid_remove()

        # Increment the progbar
        self.PM_progbar.step()

        self.root.update_idletasks()

        return

    def PM_task_progbar_update(self):
        """
        """
        # Display if not already displayed
        if not self.PM_task_progbar.winfo_viewable():
            self.PM_task_progbar.grid()
            self.root.update_idletasks()

        # Step
        self.PM_task_progbar.start()

        self.root.update_idletasks()

        return

#   MAIN (MAIN) ===========================================================================
def main():
    """ Run the app
    """
    # # Create the screen instance and name it
    root = tk.Tk()
    app = Main(root)
    root.mainloop()
    root.quit()

#   MAIN (STARTUP) ====================================================
#   This next line runs the app as a standalone app
if __name__ == '__main__':
    # Run the function name main()
    main()