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