tkinter 中未显示框架背景色 window

Frame bg color not being displayed in tkinter window

我正在尝试在 tkinter window 上显示颜色为 #231303 的框架。正在显示框架的内容(一些进度条),没问题,但没有显示框架的颜色。 link 显示了 window 的相关部分的外观。 https://drive.google.com/file/d/1VHYW0t9UhjMUeNbwFijkrIy6RiToN0BN/view?usp=sharing 如您所见,框架颜色没有显示,也没有像我希望的那样完全填满宽度屏幕。没有错误,所以我完全空白。我四处寻找解释,但找不到任何解释。 这些是我的代码的相关部分 '''

from tkinter import *
from tkinter.ttk import *

root = Tk()                            
root.title("Game") 
root.geometry("1280x720")
root["bg"] = "gray"
style = Style()

''' '''

def qn_func(self,qn_num,iteration) :
        Game.clear(self)
        global bar1,bar2,bar3,bar4
        style.configure("var.TFrame",bg="#231303")
        frame = Frame(root,height=120,width=1280,style="var.TFrame")
        frame.grid(row=0,column=0,sticky=W+E+N)

''' 在这里,bar1、bar2、bar3 和 bar4 是我在框架内显示的进度条。我实际上是 tkinter 的新手,所以请尽量保持简单。我还尝试在测试文件中只显示框架及其内容,这次显示了颜色,但框架宽度的问题仍然存在。 有谁知道为什么会这样?如果有人能告诉我为什么会这样,那将是一个很大的帮助。我也在我的代码中使用 tkinter.ttk。

也许您想考虑更可靠的 OOP 实现。

#don't pollute your namespace
import tkinter as tk
import tkinter.ttk as ttk
from dataclasses import dataclass, asdict


#create a "struct" to default to that represents ALL options for the widget
@dataclass
class Frame_dc:  
    background:  str = 'black'
    bordercolor: str = 'black' 
    darkcolor:   str = 'black'
    lightcolor:  str = 'black'
    relief:      str = 'flat'
    

#prepare your data
HeaderFrame = asdict(Frame_dc(*['#231303']*4)) #overwrite the first 4 vars with your custom color
ErrorFrame  = asdict(Frame_dc(*['red']*4))
 

#wrap all your styles in a custom theme 
class CustomTheme(ttk.Style):
    def __init__(self, basetheme='clam'):
        ttk.Style.__init__(self)
        
        #slim example
        self.theme_create('custom', basetheme, {
            'custom.TFrame': {
                'configure': HeaderFrame,
            },
            'error.TFrame': {
                'configure': ErrorFrame,
            },
            #add more custom styles here
            #see: https://docs.python.org/3/library/tkinter.ttk.html#tkinter.ttk.Style.theme_create
        })
        self.theme_use('custom')
        

#extend your root
class App(tk.Tk):
    #define application constants
    WIDTH  = 1280
    HEIGHT = 720
    TITLE  = 'Game'

    def __init__(self, **kwargs):
        tk.Tk.__init__(self, **kwargs) #be more specific than "super()"
        CustomTheme()
        
        self.configure(bg="gray")
        
        #name things what they are
        self.header = ttk.Frame(self, height=120, style="custom.TFrame")
        self.header.grid(row=0, column=0, sticky='wen')
        
        #make `self.frame` fill width ~ 
        #technically this is making the entire column fill the width
        #but only because there is no other column with weight to disperse
        self.grid_columnconfigure(0, weight=1)
        

#properly initialize your app
if __name__ == '__main__':
    app = App()
    app.title(App.TITLE)
    app.geometry(f'{App.WIDTH}x{App.HEIGHT}')
    app.mainloop()

旁白:

远离global。我想不出有哪一种语言 global 是一件好事,而且我知道 很多 种语言。一个好的设计模式实现encapsulationglobalencapsulation 的对立面。 global 也可以被视为强制依赖,具体取决于上下文。然后你就有了整个问题:如果我要破解你的游戏,你就把所有的胆量都敞开让我玩。如果你有一个好的设计,你可能 永远不会 在你的整个余生中使用 global,而不会在功能和访问方面做出任何牺牲。