【问题标题】:Building a tkinter GUI module, so the main program doesn't need to import tkinter构建一个 tkinter GUI 模块,所以主程序不需要导入 tkinter
【发布时间】:2017-11-18 23:43:29
【问题描述】:

我想创建一个 GUI 模块,我可以在我的主程序中导入它,而不必在那里导入 tkinter,让模块处理所有事情。这是我想象它可能起作用的方式:

main.py

import gui as g

def update():
    #Update the GUI with new Data from this main program

GUI = g.gui()
gui.after(1000, update)
gui.mainloop()

gui.py

import tkinter as tk

class viewer(tk.Frame):
    #Some variables
    def __init__(self, parent):
        tk.Frame.__init(self, parent)
        self.parent = parent
        self.initialize(400, 100)
    def initialize(self, width, height):
        #Initialize some widgets, place them on grid, etc
    def start(self):
        #Do some other stuff, make a main window, configurations, etc
        print('Started!')

编辑:“不要征求意见” 我该如何完成这项工作?

import tkinter as tk
import gui as g

root = tk.Tk()
GUI = g.gui(root)
GUI.after(1000, update)
GUI.mainloop()

以上是我不想要的。

【问题讨论】:

  • 你在征求意见,这与这里无关。
  • 顺便说一句:模块 turtlegraphics.pyEasyGui 使用 tkinter 并且您不必导入 tkinter - 这样您就可以看到它是如何工作的。
  • 上面的例子很好,虽然对我的理解水平来说太复杂了。我通过 gui 模块中的简单方法修复了它,该方法启动 gui 并返回所述对象

标签: python python-3.x user-interface tkinter


【解决方案1】:

我使用了一个对我来说似乎合理的解决方法:

main.py

import gui
GUI = gui.start()
GUI.after(1000, update)
GUI.mainloop()

gui.py

import tkinter as tk
def start():
   root = tk.Tk()
   run = viewer(root) # <- The class provided above
   return run

【讨论】:

  • 你的解决方案很短,但对我来说它看起来很奇怪。为了隐藏它,我会将root = Tk() 直接放在viewer.__init__ 中。与root.mainloop()root.update() 相同,然后我可以将其作为gui.viewer(update) 运行。或者我会创建class Viewer(tk.Tk)
  • 之所以这样,是因为我的代码比我提供的要长。例如,我在 Viewer 类中声明“self.parent = parent”,并说 parent 作为 root 提供。然后我有隐藏需要寻址根的主窗口的方法,我发现最好的方法是使用'self.parent'
  • 最重要的是您的解决方案适合您 :) 祝您好运。
  • 嘿,谢谢。我知道它并不完美,但是在截止日期前运行时,只要它可以正常工作并且不会产生任何错误,就不必一切都完美。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
  • 2019-04-15
  • 2021-03-04
  • 2019-02-06
相关资源
最近更新 更多