【问题标题】:tkinter GUI with multiple independent GUI files具有多个独立 GUI 文件的 tkinter GUI
【发布时间】:2018-09-13 22:11:30
【问题描述】:

我目前有一个 tkinter 应用程序,它有一个窗口和很多按钮。

作为一个sn-p,代码大概是:

import tkinter as tk

def openWindow():
    window = tk.Toplevel(root)

root = tk.tk()

~ ~ ~ ~

root.mainloop()

使用 openWindow() 函数生成的窗口很可能是我的主程序旁边的一个相当复杂的窗口。与其拥有一个非常大的 python 文件,我更喜欢它,如果我有另一个可以独立打开的单独 python 文件,或者导入到我的主程序中并在单击相应按钮时打开。

我该怎么做?

谢谢

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    部分答案:

    1. 尝试将您的“业务逻辑”分离到类和模块中,并将它们放入一个或多个.py 文件中。确保您的业务模块的一种方法是在其中添加import tkinter

    2. 尝试将所有 UI 放在类和模块中,并使其不受业务逻辑的影响。扫描您的代码以查找任何涉及计算和操作的行,并询问自己是否应将这些代码行移至上述的类中。

    3. 要管理每个 UI 文件大小,请将相关小部件分组到您自己的 tk.frame 子类中。这也允许您在未来的项目中重用这些代码。

    我之前有过 GUI 恐惧症,但在 tkttk 学习和编码几周后,我设法创建了一个超级小部件,它实际上可以在两个不相关的项目中重复使用。

    【讨论】:

      【解决方案2】:

      考虑为 GUI 的主要区域创建单独的类。

      假设您有一个标签、条目和按钮小部件,它们的作用类似于文件选择小部件,当您单击按钮时,它会打开一个对话框以选择文件,然后选择的文件路径会显示在条目字段中. 所有这些代码可以一起存在,它定义了小部件所有元素的行为和外观。

      这可以作为一个独立的小部件实现,如下所示。

      from tkinter import *
      from tkinter import filedialog
      
      class FileSelect(Frame):
          def __init__(self,master,label="",**kw):
              Frame.__init__(self,master)
              self.configure(**kw)
              self.file = StringVar()
      
              self.Label = Label(self, text=label)
              self.Label.config(width=10,anchor=E)
              self.filenamebox = Entry(self,text=self.file)
              self.filenamebox.config(width=50)
              self.btnBrowse = Button(self,text='Browse',command=self.browse_file)
              self.btnBrowse.config(width=10)
              self.Label.grid(row=0,column=0,pady=5,sticky=E)
              self.filenamebox.grid(row=0,column=1,pady=5)
              self.btnBrowse.grid(row=0,column=2,pady=5,padx=5)
      
          def browse_file(self):
              filename = filedialog.askopenfilename(filetypes=[('All File','*.*')])
              self.file.set(filename)
      
          def get_filename(self):
              return self.file.get()
      
      
      def main():
          root = Tk()
          root.title("Example Widget")
      
          FileSelect(root,label="My File").grid()    
          root.mainloop()
      
      
      if __name__ == '__main__':
          main()
      

      我们还可以将此功能包含在更大的 GUI 代码部分中。

      from otherFile import FileSelect
      ....
      fileSelect = FileSelect(root,label="Select New File")
      fileSelect.grid()
      

      (otherFile 是包含 FileSelect 小部件的 python 文件的名称) 使用这种方法,您可以在单独的代码文件中为您的 GUI 创建更小的代码部分,并将它们构建成一个更复杂的示例。

      如果您有执行“非 gui”功能的代码部分,例如读取文件,请将它们放入单独的函数或类中,您可以将它们导入到您的主代码中。

      【讨论】:

      • 感谢您的回复。太完美了
      猜你喜欢
      • 2018-09-21
      • 1970-01-01
      • 2017-10-23
      • 2012-07-21
      • 1970-01-01
      • 2011-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多