首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TopLevel面向对象问题

TopLevel面向对象问题
EN

Stack Overflow用户
提问于 2021-08-05 19:31:38
回答 1查看 75关注 0票数 0

我对编码和平移很陌生。我正在用youtube_dl和tkinter制作一个Downloader,我一般对TopLevel和OOP有几个问题。

下面是我的代码的一个简化版本(我刚刚删除了另一个按钮、图片等)

代码语言:javascript
复制
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()

  1. 在DownVid类中正确地实现了TopLevel吗?

如果我使用

  1. 代替super().__init__()来初始化TopLevel,为什么我必须将父参数而不是self传递给它呢?你怎么知道什么时候该使用自我或父母?

当我必须在欢迎类中使用

  1. 时,为什么在DownVid类中使用self.geometry()

任何帮助都是非常有用的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-05 20:05:12

我在DownVid类中正确地实现了TopLevel吗?

不完全是。您需要将父文件传递给Toplevel.__init__

代码语言:javascript
复制
Toplevel.__init__(self, parent)

在这种情况下,省略parent是无害的,因为默认情况是根窗口。但是,最好的做法是始终为除根窗口之外的每个小部件传递一个父部件。小部件存在于层次结构中,明确地定义该层次结构是很好的。

另外,我认为它不应该对其父级调用withdraw。对我来说,这应该是创建新窗口的代码的责任。

--如果我使用super().__init__()来初始化TopLevel,为什么我必须作为参数传递父参数而不是self?

除了根窗口之外,每个小部件都需要一个父部件。无论您调用Toplevel.__init__还是调用super().__init__,都应该始终提供父程序。

为什么要在欢迎类中使用self.parent.geometry(),而在DownVid类中使用self.parent.geometry()呢?

因为Welcome类不是顶级窗口。它根本不是一个小部件,所以在不是小部件的东西上调用像geometry这样的方法将会失败。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68672531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档