【问题标题】:Label text isn't appearing in tkinter Frame标签文本未出现在 tkinter 框架中
【发布时间】:2021-09-05 22:07:37
【问题描述】:

我一直在研究这个问题,但我发现的解决方案似乎都不起作用。我试图让Label(下面代码中的self.status_bar)出现在我的框架中,但是我所做的任何编辑(即使用update() 方法或调整框架/文本小部件/窗口的大小)让我无处可去。

from tkinter import *
from tkinter import filedialog
from tkinter import font

#Build frame with features to put into parent window
class TextEditor:
    def __init__(self, master):
        self.master = master
        self.frame = tk.Frame(self.master)
        
        #Create Scrollbar
        self.text_scroll = tk.Scrollbar(self.frame)
        self.text_scroll.pack(side=RIGHT, fill=Y)
        
        #Create text box
        self.text = tk.Text(self.frame, width=155, height=55, font=('Helvetica', 12), selectbackground="yellow",  
                            selectforeground = "black", undo=True, yscrollcommand=self.text_scroll.set)
        self.text.pack()
        
        #Configure scrollbar
        self.text_scroll.config(command=self.text.yview)
        
        #Create menu
        self.menu = tk.Menu(self.master)
        self.master.config(menu=self.menu)
        
        #Add file menu
        self.file_menu = tk.Menu(self.menu, tearoff=False)
        self.menu.add_cascade(label="File", menu=self.file_menu)
        self.file_menu.add_command(label="Open")
        self.file_menu.add_command(label="Save")
        self.file_menu.add_command(label="New")
        self.file_menu.add_separator()
        self.file_menu.add_command(label="Exit", command=self.master.destroy) 
        
        #Add edit menu
        self.edit_menu = tk.Menu(self.menu, tearoff=False)
        self.menu.add_cascade(label="Edit", menu=self.edit_menu)
        self.edit_menu.add_command(label="Cut")
        self.edit_menu.add_command(label="Copy")
        self.edit_menu.add_command(label="Undo")
        self.edit_menu.add_command(label="Redo")
        
        #Add status bar to bottom of app
        self.status_bar = tk.Label(self.frame, text="Ready", anchor=E)
        self.status_bar.pack(fill=X, side=BOTTOM, ipady=5)
        
        #Pack frame into window
        self.frame.pack()
        
#Instantiates the text editor app
def main():
    root = tk.Tk()
    app = TextEditor(root)
    root.geometry("1220x660")
    root.title("Text Editor")
    root.mainloop()
    
if __name__ == '__main__':
    main()

【问题讨论】:

    标签: python python-3.x tkinter


    【解决方案1】:

    您正在强制窗口大小太小而无法容纳所有小部件。当您在使用pack 时这样做时,pack 将开始缩小小部件以使其适合,从最后一个打包的小部件开始。在这种情况下,这就是状态栏。因此,pack 开始从self.status_bar 中删除像素,直到有足够的空间容纳其他小部件。最终,它必须完全移除状态栏,然后开始缩小文本小部件。

    第一步是先创建状态栏,使文本小部件在堆叠顺序中更高(即:pack 会在收缩其他小部件之前尝试收缩它)。

    您应该做的第二件事是使用适当的选项让TextEditor 窗口填充框架,并让框架填充窗口。例如:

    self.text.pack(fill="both", expand=True)
    self.frame.pack(fill="both", expand=True)
    

    【讨论】:

      【解决方案2】:

      对于更复杂的布局,我建议您使用grid 方法而不是pack。这是网格化而不是打包的小部件的代码:

      import tkinter as tk
      from tkinter import filedialog
      from tkinter import font
      from tkinter.constants import *
      
      #Build frame with features to put into parent window
      class TextEditor:
          def __init__(self, master):
              self.master = master
              self.frame = tk.Frame(self.master)
              
              #Create Scrollbar
              self.text_scroll = tk.Scrollbar(self.frame)
              self.text_scroll.grid(row=0, column=1, sticky=E+NS) ### EDITED THIS LINE
              
              #Create text box
              self.text = tk.Text(self.frame, font=('Helvetica', 12), selectbackground="yellow",  ### EDITED THIS LINE
                                  selectforeground = "black", undo=True, yscrollcommand=self.text_scroll.set)
              self.text.grid(row=0, column=0, sticky=NSEW) ### EDITED THIS LINE
              
              #Configure scrollbar
              self.text_scroll.config(command=self.text.yview)
              
              #Create menu
              self.menu = tk.Menu(self.master)
              self.master.config(menu=self.menu)
              
              #Add file menu
              self.file_menu = tk.Menu(self.menu, tearoff=False)
              self.menu.add_cascade(label="File", menu=self.file_menu)
              self.file_menu.add_command(label="Open")
              self.file_menu.add_command(label="Save")
              self.file_menu.add_command(label="New")
              self.file_menu.add_separator()
              self.file_menu.add_command(label="Exit", command=self.master.destroy) 
              
              #Add edit menu
              self.edit_menu = tk.Menu(self.menu, tearoff=False)
              self.menu.add_cascade(label="Edit", menu=self.edit_menu)
              self.edit_menu.add_command(label="Cut")
              self.edit_menu.add_command(label="Copy")
              self.edit_menu.add_command(label="Undo")
              self.edit_menu.add_command(label="Redo")
              
              #Add status bar to bottom of app
              self.status_bar = tk.Label(self.frame, text="Ready", anchor=E)
              self.status_bar.grid(row=1, column=0, sticky=S+EW) ### EDITED THIS LINE
      
              # Configure the rows and columns so that they expand properly ### ADDED THESE LINES
              self.frame.rowconfigure(0, weight=1) ### ADDED THESE LINES
              self.frame.columnconfigure(0, weight=1) ### ADDED THESE LINES
              
              #Pack frame into window
              self.frame.pack(expand=YES, fill=BOTH) ### EDITED THIS LINE
              
      #Instantiates the text editor app
      def main():
          root = tk.Tk()
          app = TextEditor(root)
          root.geometry("1220x660")
          root.title("Text Editor")
          root.mainloop()
          
      if __name__ == '__main__':
          main()
      

      请注意,我还如何更改了将框架打包到窗口中的行。之前保持框架填充窗口的唯一因素是文本小部件的大小。

      通过这些更改,小部件可以正常展开,因此我还从 self.text 的创建中删除了 widthheight 参数。

      【讨论】:

      • 没问题!请记住投票或接受回答您问题的答案。这样,其他用户就知道该问题不再需要回答了。 ;-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-29
      • 1970-01-01
      • 2021-11-13
      • 2018-04-25
      • 1970-01-01
      • 2017-01-27
      • 2020-09-15
      相关资源
      最近更新 更多