如何在多个文件中拆分Python Tkinter代码

时间:2017-04-04 13:30:40

标签: python python-3.x tkinter

这是我在这里的第一篇文章!

首先来看我的project的github链接(我也是github上的noob)。

编辑:

所以这里有一个我想做的例子,我有一个很大的Tkinter类,包括框架,标签,菜单,按钮以及所有功能。

我想在我的MakeUI()中使用UI描述并将我的func移动到另一个文件,但我仍然需要访问小部件。

< Main.py>

# -*- coding: utf-8 -*-

from tkinter import *
from Interface import *


Fenetre = Tk()
UI = MakeUI(Fenetre)

UI.mainloop()

UI.destroy()

< Interface.py>

# -*- coding: utf-8 -*-

from tkinter import *
from tkinter.filedialog import *


class MakeUI(Frame):

    def __init__(self, Fenetre, **kwargs):

        # Héritage
        Frame.__init__(self, Fenetre, width=1500, height=700, **kwargs)

        self.pack(fill=BOTH)

        self.FrameInfos = LabelFrame(self, text="Choix des paramètres", padx=2, pady=2)
        self.FrameInfos.pack(fill="both", expand="yes", padx=5, pady=5)

        self.MsgInfosCarte = Label(self.FrameInfos, text="Example", width=45)
        self.MsgInfosCarte.pack(padx=2, pady=2)

    def AfficherCarte(self):
        self.MsgInfosCarte["text"] = "OK"

现在在这个例子中,我需要将AfficherCarte函数移动到另一个文件,如MapFuncs.py或其他文件。 我希望MakeUI能够调用其他文件func和其他文件func来修改界面。

我无法正确地做到这一点。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

为了在单独的文件中移动修改GUI小部件的功能,您只需将小部件实例(或存储此实例的对象)作为传递即可。函数的输入参数

< MapFuncs.py>

def AfficherCarte(UI):
    UI.MsgInfosCarte["text"] = "OK"

< Interface.py>

import tkinter as tk
from MapFuncs import AfficherCarte

class MakeUI(tk.Frame):

    def __init__(self, Fenetre, **kwargs):

        # Héritage
        tk.Frame.__init__(self, Fenetre, width=1500, height=700, **kwargs)
        self.pack()

        self.FrameInfos = tk.LabelFrame(self, text="Choix des paramètres", padx=2, pady=2)
        self.FrameInfos.pack(fill="both", expand="yes", padx=5, pady=5)

        self.MsgInfosCarte = tk.Label(self.FrameInfos, text="Example", width=45)
        self.MsgInfosCarte.pack(padx=2, pady=2)

        # Call function from external file to modify the GUI
        AfficherCarte(self)

如果您因为代码过大而执行此操作,另一种方法是将GUI划分为界面的每个主要部分的单独类(请参阅https://stackoverflow.com/a/17470842/4084269)。