首页 > 编程问答 >tkinter 中带有红色背景的默认最大化窗口

tkinter 中带有红色背景的默认最大化窗口

时间:2024-07-28 16:49:50浏览次数:10  
标签:python windows tkinter

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

解释:

  1. 最大化窗口:
  2. 我们使用 self.attributes('-fullscreen', True) 来使窗口最大化。这将在 Windows 中提供正确的最大化行为,包括显示恢复按钮。

  3. 红色背景:

  4. 我们创建一个新的 main_frame ,其背景颜色设置为红色 ( bg='red' )。
  5. 我们使用 pack(fill="both", expand=True) 将此框架展开以填充整个根窗口。这确保红色背景覆盖整个应用程序区域。
  6. content_frame 的父级从 self (根窗口)更改为 self.main_frame ,这样它就会放置在红色背景框架内。

现在,当你运行代码时,你将拥有一个最大化的窗口,其背景为红色,并且表格也将在红色背景上。

标签:python,windows,tkinter
From: 78803329

相关文章

  • Adobe Photoshop 2024 v25.11 (macOS, Windows) - 照片和设计软件
    AdobePhotoshop2024v25.11(macOS,Windows)-照片和设计软件Acrobat、AfterEffects、Animate、Audition、Bridge、CharacterAnimator、Dimension、Dreamweaver、Illustrator、InCopy、InDesign、LightroomClassic、MediaEncoder、Photoshop、PremierePro、AdobeXD......
  • Adobe Illustrator 2024 v28.6 (macOS, Windows) - 矢量绘图
    AdobeIllustrator2024v28.6(macOS,Windows)-矢量绘图Acrobat、AfterEffects、Animate、Audition、Bridge、CharacterAnimator、Dimension、Dreamweaver、Illustrator、InCopy、InDesign、LightroomClassic、MediaEncoder、Photoshop、PremierePro、AdobeXD什么是......
  • Blender 4.2 LTS (macOS, Linux, Windows) - 开源 3D 创意软件 (渲染 建模 雕刻)
    Blender4.2LTS(macOS,Linux,Windows)-开源3D创意软件(渲染建模雕刻)创造的自由Blender获得GNUGPL许可,由其贡献者拥有。因此,Blender永远是免费和开源软件。使命以免费/开源软件的形式将世界上最好的3DCG技术交到艺术家手中。想象每个人都应该自由地创......
  • 如何在 Python 中创建正确显示素数的代码?
    素数是只能被自身和1整除的数。例如,数字5是素数,因为它只能被1整除和5.然而,数字6不是质数,因为它可以被整除通过2和3。编写一个名为is_prime的布尔函数,它接受一个整数作为参数如果参数是素数则返回true,否则返回false。使用程序中提示用户输入数字然后输......
  • 在 MySQL Workbench 中升级 python
    MySQLWorkbench中的python版本不断受到安全标记,因为它不是最新版本。我的电脑上有最新版本,但在MySQL文件中它似乎是旧版本。我怎样才能更新,使其与我的电脑版本相同?尝试看看是否可以更新python,但没有运气很遗憾,你无法直接升级MySQLWorkbench内置的Python版本......
  • Python科研武器库 - 文件/路径操作 - 判断路径是否存在
    使用场景:在科研中,用Python处理数据的一个核心目的是批量处理,批量处理节省了研究者大量的时间和精力,不然,还不如手动一个个地去处理。批量处理通常要求数据整体较为规整,能够进行统一的处理操作,但实际数据中总存在一些不规则的样本,甚至有些样本的命名都存在不规范,例如,整个数据集......
  • python刷题常用模板
    #=====================================素数筛Begin=====================================#MAXN=1000prime=[]isprime=[True]*(MAXN+1)defeuler():isprime[1]=Falseforiinrange(2,MAXN+1):ifisprime[i]:prime.append(i)......
  • 在Windows使用Java编译工具
    文章目录创建java文件编译Java文件运行Java文件创建java文件桌面右键->新建->文本文档双击打开输入publicclassHello{publicstaticvoidmain(String[]args){ System.out.println("HelloWorld!"); }}将文件名改为hello后缀.java编译Java文......
  • 在Windows下安装设置IDEA 2024.1.4
    文章目录下载IDEA安装IDEA设置IDEA汉化IDEA(可选)创建一个Java项目激活IDEA下载IDEAIDEA下载直链安装IDEA双击打开下载好的安装包,点击下一步更改你的安装目录,完成后下一步根据自己的需求来勾选安装选项,完成后下一步选择开始菜单目录,这里默认安装等待进度......
  • [附开题]flask框架的全国汽车销售信息查询系统的设计与实现7m1w0(python+源码)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着中国汽车市场的蓬勃发展,汽车品牌的日益丰富以及消费者购车需求的多样化,汽车销售信息的准确性与时效性成为了市场关注的焦点。传统汽车......