【问题标题】:TopLevel OOP Questions顶级 OOP 问题
【发布时间】: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()
  1. 我是否在 DownVid 类中正确实现了 TopLevel?

  2. 如果我使用super().__init__() 来初始化TopLevel,为什么我必须将parent 作为参数而不是self 传递?您如何知道何时使用 self 或 parent?

  3. 当我不得不在 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

标签: python oop tkinter


【解决方案1】:

我是否在 DownVid 类中正确实现了 TopLevel?

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

Toplevel.__init__(self, parent)

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

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

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

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

当我不得不在 Welcome 类中使用 self.parent.geometry() 时,为什么在 DownVid 类中使用 self.geometry() 有效?

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

【讨论】:

    猜你喜欢
    • 2011-02-07
    • 2011-05-07
    • 2011-01-18
    • 2014-07-18
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多