标签文本未显示在 tkinter 框架中



我一直在研究这个问题,但我找到的解决方案似乎都不起作用。我试图得到一个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()

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

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

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

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

我建议,对于更复杂的布局,您使用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参数。

最新更新