如何在Tkinter的文本小部件中放置进度条小部件?

时间:2019-03-27 13:44:27

标签: python tkinter

我想将tk.Progressbar()放在tk.Text()的最后一行。 tk.Text()被定义为仅显示5行文本。因此,tk.Progressbar()应该出现在tk.Text()的第4行中。目前,我只能将tk.Progressbar()放在tk.Text()的第一行中(请参阅测试脚本的输出)。

问题:

  1. 如何将tk.Progressbar()放在tk.Text()的第4行?
  2. 如何确保tk.Progressbar()跨越tk.Text()的整个宽度?当前,我必须手动更改width的{​​{1}}选项的值。有没有更好/更轻松/自动的方法?
  3. 如何隐藏和显示tk.Progressbar()?由于我没有使用tk.Progressbar() / grid / pack方法来放置place的位置,因此在tk.Progressbar()中显示和隐藏窗口小部件的相应命令是什么? ?

注意:我希望tk.Text()仅使用tk.Text()的第4行。

测试脚本:

tk.Progressbar()

1 个答案:

答案 0 :(得分:0)

根据@jasonharper,我将很难使用

msg.window_create( tk.INSERT, window=pbar )

将进度条放置在我想要的位置。

下面的脚本显示了我对问题1、2和3的回答。简要地说,可以使用.place().place_forget()方法以我想要的方式放置.Progressbar()。另外,.winfo_reqwidth().winfo_width()可用于确定现有窗口小部件的适当尺寸。

修订的测试版本:

import tkinter as tk
import tkinter.ttk as ttk

root = tk.Tk()
msg = tk.Text( root, width=60, height=5 )
pbar = ttk.Progressbar( msg, mode='indeterminate',
                        orient=tk.HORIZONTAL,
                        )
msg.grid( row=0, column=0, padx=10, pady=10 )

# .winfo_reqwidth() gives the width of .Text(). Subtract 2 pixel to account for
# its left and right borderwidth. The resultant is should be the width of the
# .Progressbar().
pbar['length'] = msg.winfo_reqwidth()-2

# Use .place() method to give the illusion of placing progressbar inside .Text()
# Method 1:
#pbar.place( x=1, y=msg.winfo_reqheight()-pbar.winfo_reqheight(),
#            bordermode="outside" )
# Method 2:
pbar.place( anchor='sw', x=1, y=msg.winfo_reqheight(), bordermode="outside" )

# Use .place_forget() and .place() to hide and reappear .Progressbar().
root.after( 3000, lambda: pbar.place_forget() )
root.after( 6000, lambda: pbar.place( anchor='sw', x=1,
                                       y=msg.winfo_reqheight(),
                                       bordermode="outside" ) )