tkinter小部件未显示在框架小部件中

tkinter小部件未显示在框架小部件中,tkinter,button,widget,frame,display,Tkinter,Button,Widget,Frame,Display,我正在尝试使用Tkinter库用python制作GUI。我使用了类,这样我就可以设置统一外观的按钮和框架。我遇到的问题是,当我将按钮放置、打包或网格化到框架中时,小部件不会显示。我正在尝试在控件小部件中显示回放小部件 将tkinter作为tk导入 高度=457 宽度=600 主色调='#0e2625' FG_颜色=‘白色’ 照片=[] def playing(): 打印('正在播放') #创建一个框架 类框架(tk.LabelFrame): 定义初始值(自身、名称、母版、宽度、高度、颜色=主颜色

我正在尝试使用Tkinter库用python制作GUI。我使用了类,这样我就可以设置统一外观的按钮和框架。我遇到的问题是,当我将按钮放置、打包或网格化到框架中时,小部件不会显示。我正在尝试在控件小部件中显示回放小部件

将tkinter作为tk导入
高度=457
宽度=600
主色调='#0e2625'
FG_颜色=‘白色’
照片=[]
def playing():
打印('正在播放')
#创建一个框架
类框架(tk.LabelFrame):
定义初始值(自身、名称、母版、宽度、高度、颜色=主颜色,**千瓦):
超级()
self.name=名称
self.master=master
self.width=宽度
自我高度=高度
self.color=颜色
self.frame=tk.LabelFrame(self.master,text=self.name,width=self.width,height=self.height,bg=self.color)
self.frame['前景]=FG_颜色
def网格(自身、行、列、行span=None、列span=None):
self.frame.grid(row=row,column=column,rowspan=rowspan,columnspan=columnspan,padx=5)
#类用作按钮的蓝图
类按钮(tk.按钮):
计数器=0
定义初始化(自身、名称、主控、命令、图像,**kw):
超级()
self.name=名称
self.image=image
self.master=master
self.command=命令
self.ref=按钮。计数器
全球照片
img=tk.PhotoImage(file=self.image)
img=img.子样本(5,5)
照片。附加(img)
self.name=tk.Button(self.master,text=name,command=command,width=10,image=photo[self.ref],component='left')
按钮。计数器+=1
#配置根屏幕
root=tk.tk()
root.title('PlayR')
配置(bg=MAIN\u颜色)
屏幕=str(宽度)+“x”+str(高度)
根几何体(屏幕)
根目录。可调整大小(False,False)
详图框架=框架(“详图”,根部,(宽度/2)-10350)
框架网格详图(0,0,1,1)
图像_frame=框架('盖',根部,(宽度/2)-10350)
图像帧网格(0,1,1,1)
control_frame=Frames('controls',root,WIDTH-20100)
控制框架网格(1,0,1,2)
播放=按钮('play',control_frame,playing,'Assets/play button arrowhead.png'))
play.grid(行=0,列=0)
pause=按钮('pause',控制帧,播放,'Assets/pause.png')
pause.grid(行=0,列=1)
停止=按钮('stop',控制框架,播放,'Assets/stop.png')
stop.grid(行=0,列=2)
prev=按钮('prev',控制帧,播放,'Assets/previous.png')
上一个网格(行=0,列=3)
play_next=按钮('next',control_frame,playing,'Assets/next.png'))
播放next.grid(行=0,列=4)
root.mainloop()

您没有正确使用继承。让我们看看这段代码:

# Create a frame framework
class Frames(tk.LabelFrame):
    def __init__(self, name, master, width, height, color=MAIN_COLOR, **kw):
        super().__init__(master, **kw)
        ...
        self.frame = tk.LabelFrame(self.master, text=self.name, width=self.width, height=self.height, bg=self.color)
这将创建两个框架小部件。实例本身(
self
)是一个
LabelFrame
,而
self.frame
是另一个LabelFrame

稍后,您将创建一个名为
detail\u frame
的此类实例,并在其中放置一个按钮。该按钮是
detail\u frame
的子项,而不是内部框架
self.frame
。由于自定义的
网格
方法作用于
self.frame
而不是
self
detail\u frame
从不添加到根目录,因此它及其所有子目录都不可见

正确的解决方案是不要创建
self.frame
。因为
self
已经是一个框架,所以您尝试做的事情完全没有必要。您也不需要覆盖
网格
命令,因为您没有添加任何值

使用
按钮
类也会犯同样的错误。当它应该只创建一个按钮时,它会创建两个按钮。

尝试以下操作:

将tkinter作为tk导入
#在设置常量方面做得很好
高度=457
宽度=600
主色调='#0e2625'
FG_颜色=‘白色’
def playing():
打印('正在播放')
#创建一个框架
类框架(tk.LabelFrame):
定义初始值(自、主、颜色=主颜色,**kwargs):
self.color=颜色
super()。\uuuuu初始化(self.master,bg=self.color,fg=fg\u color,**kwargs)
def网格(自身,**kwargs):
#使用kwargs,因为稍后您将忘记args的顺序。
#现在试试:是(行,列)还是(列,行)
超级网格(padx=5,**kwargs)
#类用作按钮的蓝图
类按钮(tk.按钮):
#大师总是第一位(特金特惯例)
def _初始__(自身、主控、图像、宽度=10,**kwargs):
self.image=image
#这是保存图像引用的更好方法
self.img=tk.PhotoImage(file=self.image)
self.img=self.img.子样本(5,5)
super()。\uuuu init\uuuuu(主控,宽度=宽度,图像=self.img,component='left',**kwargs)
#配置根屏幕
root=tk.tk()
root.title('PlayR')
配置(bg=MAIN\u颜色)
屏幕=str(宽度)+“x”+str(高度)
根几何体(屏幕)
根目录。可调整大小(False,False)
控件\框架=框架(根,text='controls',width=width-20,height=100)
控制框架网格(行=1,列=0,列跨度=2)
播放=按钮(控制框,文本='play',命令=播放,图像='img.png')
play.grid(行=0,列=0)
root.mainloop()

正如@BryanOakley所说,您没有正确使用继承。此外,您的代码不是pythonic。我想我把它做得更像python了,我想它现在可以工作了。

你知道,当你调用
框架时。

你创建了2
tk.LabelFrame
对吗?你也不需要有
全局照片
,因为它是一个可变对象。
self.master=master
框架内。
不是必需的,因为每个tkinter小部件,
self.master
都是隐式创建的。@acw1668 True thx。我从另一个类中删除了
self.master=master
,但忘记了一个:D.你是对的。这本书读起来容易多了,而且看起来好多了。谢谢你