tkinter小部件未显示在框架小部件中
我正在尝试使用Tkinter库用python制作GUI。我使用了类,这样我就可以设置统一外观的按钮和框架。我遇到的问题是,当我将按钮放置、打包或网格化到框架中时,小部件不会显示。我正在尝试在控件小部件中显示回放小部件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作为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了,我想它现在可以工作了。你知道,当你调用
框架时。你创建了2tk.LabelFrame
对吗?你也不需要有全局照片
,因为它是一个可变对象。self.master=master
在框架内。
不是必需的,因为每个tkinter小部件,self.master
都是隐式创建的。@acw1668 True thx。我从另一个类中删除了self.master=master
,但忘记了一个:D.你是对的。这本书读起来容易多了,而且看起来好多了。谢谢你