【问题标题】:Python Tkinter safe to self.quit or sys.exit?Python Tkinter 对 self.quit 或 sys.exit 安全吗?
【发布时间】:2016-06-01 20:40:28
【问题描述】:

本着解耦的精神,我没有将许多小部件塞进一个巨大的类中,而是尝试将它们分成不同的类。

我遇到的问题是 FileMenu 类不知道 root,因此无法调用 root.quit 或 root.destroy。一时兴起,我尝试了 self.quit,它确实有效,但我以前从未见过它使用过。

我的问题是:

  1. self.quit 是退出应用的安全方法吗?
  2. sys.exit 是退出应用的安全方法吗?
  3. 如果两者都不安全,是否有一种很好的方法来解耦设计并安全退出,而不会将 root 作为参数传递到任何地方或使其成为全局参数?

我的例子:

import Tkinter as tk

class FileMenu(tk.Menu):
    def __init__ (self, parent):
        tk.Menu.__init__(self, parent, tearoff=False)
        self.add_command(label='Exit', command=self.quit)

class MainMenu(tk.Menu):
    def __init__ (self, parent):
        tk.Menu.__init__(self, parent, tearoff=False)
        self.file_menu = FileMenu(self)
        self.add_cascade(label='File', menu=self.file_menu)

class View:
    def __init__ (self, parent):
        self.frame = tk.Frame(parent)
        self.parent = parent
        self.menu = MainMenu(self.frame)
        self.parent.configure(menu=self.menu)
        self.parent.geometry('200x200')
        self.frame.pack(fill='both', expand=True)

class App:
    def __init__ (self):
        self.root = tk.Tk()
        self.view = View(self.root)

    def run (self):
        self.root.title('Window Title')
        self.root.mainloop()

if __name__ == '__main__':
    app = App()
    app.run()

【问题讨论】:

    标签: python python-2.7 tkinter tk


    【解决方案1】:

    两者用途不同:

    sys.exit():关闭完整的应用程序。

    self.quit:如果您的应用程序中有多个窗口并且您不想关闭整个应用程序,那么您应该使用 self.quit()。

    两者都可以安全使用,但用途不同。

    【讨论】:

      【解决方案2】:

      如果类不知道根对象,但您希望它作用于根对象,则应将其传入。

      App 中,您将根对象传递给View

      self.view = View(self.root)
      

      View 中,您创建一个MainMenu 并将其传递给self.frame

      self.menu = MainMenu(self.frame)
      

      相反,也将根对象传递给它:

      self.menu = MainMenu(self.frame, parent)
      

      并使MainMenu 期望该对象的参数,并将其传递给FileMenu

      class MainMenu(tk.Menu):
          def __init__ (self, parent, root):
              tk.Menu.__init__(self, parent, tearoff=False)
              self.file_menu = FileMenu(self, root)
              self.add_cascade(label='File', menu=self.file_menu)
      

      然后让FileMenu 期望该根对象的参数。现在它可以访问它了:

      class FileMenu(tk.Menu):
          def __init__ (self, parent, root):
              tk.Menu.__init__(self, parent, tearoff=False)
              self.add_command(label='Exit', command=root.destroy)
      

      您可以使用 Tkinter 根对象的 destroy 方法正确退出应用程序。

      【讨论】:

        猜你喜欢
        • 2015-01-13
        • 2016-04-28
        • 1970-01-01
        • 2018-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多