【发布时间】:2021-10-10 19:31:56
【问题描述】:
我是编码和 tkinter 的新手。我正在使用 youtube_dl 和 tkinter 制作一个 YT 下载器,我一般对 TopLevel 和 OOP 有几个问题。
这是我的代码的简化版本(我刚刚删除了其他按钮、图片等)
from tkinter import Button,Frame,Label,Toplevel,Tk
class Welcome:
def __init__(self,parent):
self.parent = parent
self.parent.title("YT Downloader")
self.parent.geometry("600x600")
self.video_button = Button(self.parent, text = "Download a video", command = self.OpenVidDown)
self.video_button.place(relx = .3, rely=.6, relwidth = .4, relheight = .1)
def OpenVidDown(self):
DownVid(self.parent)
class DownVid(Toplevel):
def __init__(self, parent):
parent.withdraw()
Toplevel.__init__(self)
self.geometry("551x600")
self.title("Video Downloader")
def main():
main = Tk()
opening_screen = Welcome(main)
main.mainloop()
if __name__ == "__main__":
main()
-
我是否在 DownVid 类中正确实现了 TopLevel?
-
如果我使用
super().__init__()来初始化TopLevel,为什么我必须将parent 作为参数而不是self 传递?您如何知道何时使用 self 或 parent? -
当我不得不在 Welcome 类中使用
self.parent.geometry()时,为什么在 DownVid 类中使用self.geometry()有效?
任何帮助将不胜感激!
【问题讨论】:
-
不是关于 SO 的问题(也不能问多个问题),也许更适合 CodeReview。 1、你说的正确是什么意思?它有效吗?如果是,那么可能一切都很好。 2.看一些OOP教程,一个根本不需要
self作为第一个参数,而另一个则需要。 3.欢迎类不是容器,它只是影响parent的容器,所以你需要更改parent的东西,DownVid本身是一个窗口(因为继承)所以它具有继承的属性跨度> -
我建议查看一些专注于 python 的面向对象编程教程。
super().function(*args, **kwargs)也与BaseClass.function(self, *args, **kwargs)相同。 -
对于 2),如果您使用
super().__init__()而不是Toplevel.__init__(self),则无需传递self。无论哪种方式,将parent参数传递给Toplevel是可选的——是否需要它取决于你在做什么(通常你不需要传递它,但你可能会传递它)。对于 3),因为Welcome不是任何东西的子类。 -
@Matiiss:我不认为这个问题已经准备好发布到Code Review Stack Exchange。