在Tkinter的文件夹中动态初始化Frames

拉姆吉特

我正在尝试将文件夹中包含的所有框架作为包导入,然后初始化所有这些框架,以便可以raise在按下按钮时将它们放回原处。

这是我的文件夹结构:

+-projectfolder
|--bargraphtutor.py
|-- __init__.py (empty)
|--pages
   |--startpage.py
   |-- .
   |-- .
   |--aboutpage.py
   |--__init__.py

__init__.pypages文件夹具有以下代码全部打包.py该文件夹中的文件到pages那是从这个问题出发的

from os.path import dirname, basename, isfile, join
import glob

pages = glob.glob(join(dirname(__file__), "*.py"))
__all__ = [ basename(f)[:-3] for f in pages if isfile(f) and not f.endswith('__init__.py')]
from . import *

然后我去做import pages as p问题是,每个框架都是文件中的一个类,要初始化每个框架,我必须知道每个文件的名称和类名称:

示例:bargraphtutor.py的一部分

self.frames = {}
for F in (p.aboutpage.AboutPage, p.startpage.StartPage): # This is where I'd like to make as 
    page_name = F.__name__                               # automated as possible. 
    frame = F(parent=container, controller=self)
    self.frames[page_name] = frame

    # put all of the pages in the same location;
    # the one on the top of the stacking order
    # will be the one that is visible.
    frame.grid(row=0, column=0, sticky="nsew")

示例:startpage.py:

import tkinter as tk   # python 3
from tkinter import ttk
from tkinter.ttk import Label, Button
from tkinter import font


class StartPage(tk.Frame):   # Each Frame is defined via a class

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        titleLabel= ttk.Label(self, text='This is the Startpage')
        titleLabel.pack()

那么,如何导入包,然后遍历bargraphtutor.py中的所有Frame,却又不知道所有类名?我可以使用p.__all__它返回包中所有文件的名称,但是我不知道如何从那里继续前进。

编辑:如果我将文件命名为与类相同的文件,是否会遇到名称空间问题?

斯托夫

问题:在Tkinter中的文件夹中动态初始化帧

核心点

module从中获取pages.__init__,然后获取页面class

cls = getattr(getattr(pages, module_name), page_name)

参考


注意:我没有传递controller参考,因为它与相同class App


import tkinter as tk
import pages


class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry("200x200")

        menubar = tk.Menu(self, tearoff=0)
        self.configure(menu=menubar)

        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)

        self.pages = {}
        for filename in pages.__all__:
            module_name, page_name = filename, filename
            cls = getattr(getattr(pages, module_name), page_name)

            self.pages[page_name] = frame = cls(self)

            frame.grid(row=0, column=0, sticky="nsew")
            menubar.add_command(label=page_name, command=frame.tkraise)

        # The following statements are equivalent 
        self.pages['StartPage'].tkraise()

        # From within a page object
        # self.master.pages['StartPage'].tkraise()


if __name__ == "__main__":
    App().mainloop()

使用Python测试:3.5-'TclVersion':8.6'TkVersion':8.6

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章