使用tkinter制作tkinterUI编辑器
前言
前几篇文章都是在制作编辑器的准备工作,从这篇文章开始真正的编辑器功能制作,这篇先添加菜单以及主题的修改。
一、读取配置文件
先上配置文件,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
说明:
- default中配置主题
- menu中配置菜单
- quick_btn中配置快捷按钮
- 读取配置文件,使用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()
说明:
- init_menu函数初始化菜单,从配置文件中读取所有菜单以及快捷键以及点击菜单调用的函数,鼠标右键菜单会在点击编辑控件的时候弹出来
- 点击菜单的功能函数之后进行添加
- 修改主题就是修改tabControl的背景颜色