我对编码和平移很陌生。我正在用youtube_dl和tkinter制作一个Downloader,我一般对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()如果我使用
super().__init__()来初始化TopLevel,为什么我必须将父参数而不是self传递给它呢?你怎么知道什么时候该使用自我或父母?当我必须在欢迎类中使用
self.geometry()?任何帮助都是非常有用的!
发布于 2021-08-05 20:05:12
我在DownVid类中正确地实现了TopLevel吗?
不完全是。您需要将父文件传递给Toplevel.__init__。
Toplevel.__init__(self, parent)在这种情况下,省略parent是无害的,因为默认情况是根窗口。但是,最好的做法是始终为除根窗口之外的每个小部件传递一个父部件。小部件存在于层次结构中,明确地定义该层次结构是很好的。
另外,我认为它不应该对其父级调用withdraw。对我来说,这应该是创建新窗口的代码的责任。
--如果我使用
super().__init__()来初始化TopLevel,为什么我必须作为参数传递父参数而不是self?
除了根窗口之外,每个小部件都需要一个父部件。无论您调用Toplevel.__init__还是调用super().__init__,都应该始终提供父程序。
为什么要在欢迎类中使用
self.parent.geometry(),而在DownVid类中使用self.parent.geometry()呢?
因为Welcome类不是顶级窗口。它根本不是一个小部件,所以在不是小部件的东西上调用像geometry这样的方法将会失败。
https://stackoverflow.com/questions/68672531
复制相似问题