我在 windows 11 操作系统(家庭版)中使用 Python 3.11.9
可滚动框架内有一个表格。
这是简化的代码
import tkinter as tk
class Table(tk.Frame):
def __init__(self, master, header_labels:tuple, *args, **kwargs):
tk.Frame.__init__(self, master, *args, **kwargs)
# configuration for all Labels
# easier to maintain than directly inputting args
self.lbl_cfg = {
'master' : self,
'foreground' : 'blue',
'relief' : 'raised',
'font' : 'Arial 16 bold',
'padx' : 0,
'pady' : 0,
'borderwidth': 1,
'width' : 11,
}
self.headers = []
self.rows = []
for col, lbl in enumerate(header_labels):
self.grid_columnconfigure(col, weight=1)
# make and store header
(header := tk.Label(text=lbl, **self.lbl_cfg)).grid(row=0, column=col, sticky='nswe')
self.headers.append(header)
def add_row(self, desc:str, quantity:int, rate:float, amt:float, pending:bool) -> None:
self.rows.append([])
for col, lbl in enumerate((desc, quantity, rate, amt, pending), 1):
(entry := tk.Label(text=lbl, **self.lbl_cfg)).grid(row=len(self.rows), column=col, sticky='nswe')
self.rows[-1].append(entry)
class Application(tk.Tk):
def __init__(self, title:str="Sample Application", x:int=0, y:int=0, **kwargs):
tk.Tk.__init__(self)
self.title(title)
self.config(**kwargs)
header_labels = ('', 'Description', 'Quantity', 'Rate', 'Amt', 'pending')
self.gui_btn_look = {
'foreground' : 'blue',
'relief' : 'groove',
'font' : 'Arial 20 bold',
'padx' : 5,
'pady' : 0,
}
self.content_frame=tk.Frame(self,highlightbackground="black",highlightthickness=1)
self.content_frame.grid(column=0,row=0,sticky='news')
self.canvas=tk.Canvas(self.content_frame)
scrollbar=tk.Scrollbar(self.content_frame,orient="vertical",command=self.canvas.yview,width=50)
self.canvas.configure(yscrollcommand=scrollbar.set)
self.table_frame=tk.Frame(self.canvas)
self.table_frame.grid(column=0,row=0,sticky='news')
self.table_frame.bind("<Configure>",lambda e:self.canvas.configure(scrollregion=self.canvas.bbox("all")))
self.content_frame.columnconfigure(0,weight=2)
self.content_frame.rowconfigure(0,weight=2)
self.canvas.create_window((0, 0),window=self.table_frame,anchor="nw")
self.frame_id=self.canvas.create_window((0,0),window=self.table_frame,anchor="nw")
self.canvas.grid(row=0,column=0,sticky="nswe")
self.canvas.bind_all("<MouseWheel>",self._on_mousewheel)
scrollbar.grid(row=0,column=1,sticky="ns")
self.table_frame.trial_var=0
self.table = Table(self.table_frame,header_labels,bg='red')
self.table.grid(row=0,column=0,sticky='nswe')
self.keyboard_frame=tk.Frame(self,highlightbackground="black",highlightthickness=1)
self.keyboard_frame.grid(column=1,row=0,sticky='',padx=(0,10))
self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1)
for numbers in range(1,11):
self.add_number_button=tk.Button(self.keyboard_frame,text=str(numbers%10),**self.gui_btn_look)
self.add_number_button.grid(column=int(numbers-1)%3,row=int((numbers-1)/3))
self.clear_button=tk.Button(self.keyboard_frame,text='Del',**self.gui_btn_look)
self.clear_button.grid(column=1,row=3,columnspan=2,sticky='e')
self.enter_button=tk.Button(self.keyboard_frame,text='Enter',**self.gui_btn_look)
self.enter_button.grid(column=0,row=4,columnspan=3,sticky='')
#maximizing table cell
self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1)
# update so we can get the current dimensions
self.update_idletasks()
self.geometry(f'{self.winfo_screenwidth()}x{self.winfo_screenheight()}+{0}+{0}')
# test
self.table.add_row("A", 1, 2.0, 3, True)
self.table.add_row("B", 4, 5.0, 6, False)
self.table.add_row("C", 7, 8.0, 9, True)
self.table.add_row("D", 10, 11.0, 12, False)
self.table.add_row("A", 1, 2.0, 3, True)
self.table.add_row("B", 4, 5.0, 6, False)
self.table.add_row("C", 7, 8.0, 9, True)
self.table.add_row("D", 10, 11.0, 12, False)
self.table.add_row("A", 1, 2.0, 3, True)
self.table.add_row("B", 4, 5.0, 6, False)
self.table.add_row("C", 7, 8.0, 9, True)
self.table.add_row("D", 10, 11.0, 12, False)
self.table.add_row("A", 1, 2.0, 3, True)
self.table.add_row("B", 4, 5.0, 6, False)
self.table.add_row("C", 7, 8.0, 9, True)
self.table.add_row("D", 10, 11.0, 12, False)
self.table.add_row("A", 1, 2.0, 3, True)
self.table.add_row("B", 4, 5.0, 6, False)
self.table.add_row("C", 7, 8.0, 9, True)
self.table.add_row("D", 10, 11.0, 12, False)
self.table.add_row("A", 1, 2.0, 3, True)
self.table.add_row("B", 4, 5.0, 6, False)
self.table.add_row("C", 7, 8.0, 9, True)
self.table.add_row("D", 10, 11.0, 12, False)
self.table.add_row("A", 1, 2.0, 3, True)
self.table.add_row("B", 4, 5.0, 6, False)
self.table.add_row("C", 7, 8.0, 9, True)
self.table.add_row("D", 10, 11.0, 12, False)
def _on_mousewheel(self,event):
print('scroll in table')
self.canvas.yview_scroll(int(-1 * (event.delta / 120)), "units")
if __name__ == "__main__":
Application(title="My Application").mainloop()
我想做以下
(1)when我运行它,然后窗口应该显示最大化,这意味着右上角的关闭和最小化按钮之间会有一个恢复按钮。我认为 self.winfo_screenheight 不会从 Y 屏幕分辨率中删除当前的 Windows 任务栏高度。
(2)我尝试了 'bg=red' 但它并没有导致所有窗口背景变成红色。我想要到处都是红色背景,而不是随处可见的灰色背景。然后我将添加代码,在单击特定按钮时将所有红色更改为白色。
谢谢。
当然,以下是可以解决这两个问题的更新后的代码,并附有解释:
import tkinter as tk
class Table(tk.Frame):
# ...(表格代码保持不变)...
class Application(tk.Tk):
def __init__(self, title:str="Sample Application", x:int=0, y:int=0, **kwargs):
tk.Tk.__init__(self)
self.title(title)
self.config(**kwargs)
# 1. 最大化窗口
self.attributes('-fullscreen', True) # 使用 '-fullscreen' 属性进行最大化
header_labels = ('', 'Description', 'Quantity', 'Rate', 'Amt', 'pending')
self.gui_btn_look = {
'foreground' : 'blue',
'relief' : 'groove',
'font' : 'Arial 20 bold',
'padx' : 5,
'pady' : 0,
}
# 2. 创建一个红色背景的框架
self.main_frame = tk.Frame(self, bg='red')
self.main_frame.pack(fill="both", expand=True) # 将框架展开以填充整个窗口
self.content_frame=tk.Frame(self.main_frame,highlightbackground="black",highlightthickness=1)
# ...(其余的代码保持不变)...
self.table = Table(self.table_frame, header_labels, bg='red') # 表格背景颜色设置为红色
# ...(其余的代码保持不变)...
# ...(其余的代码保持不变)...
if __name__ == "__main__":
Application(title="My Application").mainloop()
解释:
- 最大化窗口:
-
我们使用
self.attributes('-fullscreen', True)
来使窗口最大化。这将在 Windows 中提供正确的最大化行为,包括显示恢复按钮。 -
红色背景:
-
我们创建一个新的
main_frame
,其背景颜色设置为红色 (bg='red'
)。 -
我们使用
pack(fill="both", expand=True)
将此框架展开以填充整个根窗口。这确保红色背景覆盖整个应用程序区域。 -
将
content_frame
的父级从self
(根窗口)更改为self.main_frame
,这样它就会放置在红色背景框架内。
现在,当你运行代码时,你将拥有一个最大化的窗口,其背景为红色,并且表格也将在红色背景上。
标签:python,windows,tkinter From: 78803329