【记录】python3 使用tkinter制作tkinterUI编辑器 《十二》

使用tkinter制作tkinterUI编辑器


前言

前几篇文章都是在制作编辑器的准备工作,从这篇文章开始真正的编辑器功能制作,这篇先添加菜单以及主题的修改。

完整代码已上传到github,可从第一篇记录下载

一、读取配置文件

先上配置文件,default.ini

[default]
theme = 0

[menu]
file = new_gui#ctrl+n,open_gui#ctrl+o,save_gui#ctrl+s,new_project#ctrl+p,save_as#none
edit = delete_control#delete,move_up#ctrl+up,move_down#ctrl+down,move_left#ctrl+left,move_right#ctrl+right
view = change_theme#none

[quick_btn]
Button = Button
Canvas = Canvas
Checkbutton = Checkbutton
Combobox = Combobox
Entry = Entry
Frame = Frame
Label = Label
LabelFrame = LabelFrame
Listbox = Listbox
Message = Message
PanedWindow = PanedWindow
Progressbar = Progressbar
Radiobutton = Radiobutton
Scale = Scale
Scrollbar = Scrollbar
Separator = Separator
Spinbox = Spinbox
Text = Text
Treeview = Treeview

说明:

  1. default中配置主题
  2. menu中配置菜单
  3. quick_btn中配置快捷按钮
  4. 读取配置文件,使用configparser.ConfigParser,由于默认的configParser会强制转换大写为小写,所以封装一下,代码如下,toolConfigParser.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-

import configparser


# 默认的configParser会强制转换大写为小写
class ToolConfigParser(configparser.ConfigParser):

    def __init__(self, defaults=None):
        configparser.ConfigParser.__init__(self, defaults=defaults)

    def optionxform(self, optionstr):
        return optionstr

二、添加菜单与修改主题

先上代码,tkinterEditor.py

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import os

from tkinter import Tk, Menu
from componentMgr import componentMgr
from toolConfigParser import ToolConfigParser


EDITOR_THEME_DEFAULT = 0
EDITOR_THEME_BLACK = 1
EDITOR_THEME_WHITE = 2

EDITOR_THEME = {
    EDITOR_THEME_DEFAULT: "#252b39",
    EDITOR_THEME_BLACK: "black",
    EDITOR_THEME_WHITE: "white",
}


class tkinterEditor(componentMgr):

    def __init__(self, master, gui_path):
        componentMgr.__init__(self, master)
        self.config_parser = ToolConfigParser()
        self.config_parser.read("default.ini", encoding="utf-8-sig")
        self.load_from_xml(master, gui_path, True)
        self.theme = EDITOR_THEME_DEFAULT                                       # 主题
        self.right_edit_menu = None                                             # 鼠标右键edit菜单
        self.init_frame()

    @property
    def editor_window(self):
        return self.master.children.get("editor_window", None)

    @property
    def file_tab_window(self):
        return self.editor_window.children.get("file_tab_window", None)

    @property
    def property_list(self):
        return self.editor_window.children.get("property_list", None)

    @property
    def quick_list(self):
        return self.editor_window.children.get("quick_list", None)

    @property
    def treeview(self):
        return self.editor_window.children.get("treeview", None)

    @property
    def top_level(self):
        return self.editor_window.children.get("top_level", None)

    @property
    def entry_location(self):
        return self.top_level.children.get("entry_location", None)

    @property
    def entry_name(self):
        return self.top_level.children.get("entry_name", None)

    def init_frame(self):
        """
        初始化ui
        :return: None
        """
        self.init_menu()
        self.init_theme()

    ################################################ menu ################################################

    def init_menu(self):
        """
        初始化菜单
        :return:None
        """
        main_menu = Menu(self.master, tearoff=0, name="menu")
        self.right_edit_menu = Menu(self.master, tearoff=0)

        for menu_name in self.config_parser.options("menu"):
            menu = Menu(main_menu, tearoff=0, name=menu_name)
            for sub_menu_name_var in self.config_parser.get("menu", menu_name).split(","):
                sub_menu_name, shortcut_key = sub_menu_name_var.split("#")
                menu.add_command(label=sub_menu_name, accelerator=shortcut_key, command=getattr(self, sub_menu_name))
                if menu_name == "edit":
                    self.right_edit_menu.add_command(label=sub_menu_name, accelerator=shortcut_key, command=getattr(self, sub_menu_name))
            main_menu.add_cascade(label=menu_name, menu=menu)
        self.master.config(menu=main_menu)

    ################################################ theme ################################################

    def init_theme(self):
        """
        初始化主题
        :return:None
        """
        theme = int(self.config_parser.get("default", "theme"))
        self.set_theme(theme)

    def get_theme(self):
        return self.theme

    def set_theme(self, theme):
        if self.theme == theme:
            return
        self.theme = theme
        self.on_theme_change()

    def on_theme_change(self):
        """
        当主题切换时调用
        :return: None
        """
        self.file_tab_window.configure(background=EDITOR_THEME[self.theme])
        cur_tab = self.file_tab_window.get_cur_tab()
        if cur_tab is not None:
            frame = self.file_tab_window.get_tab_frame(cur_tab)
            frame.slide_window.configure(background=EDITOR_THEME[self.theme])

        self.config_parser.set("default", "theme", str(self.theme))
        with open('default.ini', 'w', encoding="utf-8-sig") as f:
            self.config_parser.write(f)

    ################################################ file menu ################################################

    def new_gui(self, file_path=None, prop=None, component_name=None):
        """
        新建ui
        :param file_path: 文件路径
        :param prop: 额外属性
        :param component_name: 控件名字
        :return: None
        """

    def open_gui(self):
        """
        读取ui文件
        :return: None
        """

    def save_gui(self):
        """
        保存ui文件
        :return: None
        """

    def save_as(self):
        """
        另存为
        :return: None
        """

    def new_project(self):
        """
        新项目
        :return: None
        """

    ################################################ edit menu ################################################

    def delete_control(self):
        """
        删除控件
        :return:None
        """

    def move_up(self):
        """
        向上移动控件
        :return: None
        """

    def move_down(self):
        """
        向下移动控件
        :return: None
        """

    def move_left(self):
        """
        向左移动控件
        :return: None
        """

    def move_right(self):
        """
        向右移动控件
        :return: None
        """

    ################################################ view menu ################################################

    def change_theme(self):
        """
        更换主题
        :return:
        """
        self.set_theme((self.get_theme() + 1) % len(EDITOR_THEME))


def main():
    root = Tk()
    #root.resizable(0, 0)
    path = os.path.join(os.getcwd(), "tkinterEditor.xml")
    tkinterEditor(root, path)
    root.mainloop()


if __name__ == "__main__":
    main()

说明:

  1. init_menu函数初始化菜单,从配置文件中读取所有菜单以及快捷键以及点击菜单调用的函数,鼠标右键菜单会在点击编辑控件的时候弹出来
  2. 点击菜单的功能函数之后进行添加
  3. 修改主题就是修改tabControl的背景颜色

上一篇记录 下一篇记录

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

archmage199

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值