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()