需要安装pythonnet库,通过调用WinForms组件实现
import clr
clr.AddReference("System.Windows.Forms")
clr.AddReference("System.Drawing")
from System.Windows.Forms import DockStyle, AnchorStyles, ToolStripGripStyle, ToolStripRenderMode, Padding, \
ToolStrip, ToolStripButton, ToolStripItem
from System.Drawing import Point, Size, Image
from tkinter import Frame
def tk_forms(parent, child):
from ctypes import windll
windll.user32.SetParent(int(str(child.Handle)), windll.user32.GetParent(parent.winfo_id()))
TOP = "top"
BOTTOM = "bottom"
LEFT = "left"
Right = "right"
SYSTEM = "system"
def func():
pass
class ToolBar(Frame):
def __init__(self, *args, side="top", width=25, tooltip="", **kwargs):
super().__init__(*args, **kwargs)
self._toolbar = ToolStrip()
self._toolbar.Location = Point(0, 0)
self._width = width
self._toolbar.ToolTipText = tooltip
if side == "top":
_dock = DockStyle.Top
elif side == "bottom":
_dock = DockStyle.Bottom
elif side == "left":
_dock = DockStyle.Left
elif side == "right":
_dock = DockStyle.Right
self._toolbar.Dock = _dock
self._toolbar.AutoSize = True
self._toolbar.Anchor = (AnchorStyles.Left | AnchorStyles.Top)
tk_forms(self, self._toolbar)
self.visible(False)
self.bind("<Configure>", self._evt_configure)
def _evt_configure(self, _=None):
from tkinter import _default_root
self._toolbar.Location = Point(self.winfo_x(), self.winfo_y())
if self.side() == "top" or self.side() == "bottom":
self._toolbar.Size = Size(self.winfo_width(), self._width)
if self.side() == "left" or self.side() == "right":
self._toolbar.Size = Size(self._width, self.winfo_height())
def width(self, width: int = None):
if width is None:
return self._width
else:
self._width = width
def side(self, side: str = None):
if side is None:
if self._toolbar.Dock == DockStyle.Top:
return "top"
elif self._toolbar.Dock == DockStyle.Bottom:
return "bottom"
elif self._toolbar.Dock == DockStyle.Left:
return "left"
elif self._toolbar.Dock == DockStyle.Right:
return "right"
else:
if side == "top":
_dock = DockStyle.Top
elif side == "bottom":
_dock = DockStyle.Bottom
elif side == "left":
_dock = DockStyle.Left
elif side == "right":
_dock = DockStyle.Right
self._toolbar.Dock = _dock
def visible(self, boolean):
self._toolbar.Visible = boolean
def grip(self, visible: bool = None):
if visible is None:
return self._toolbar.GripStyle
else:
if visible:
_visible = ToolStripGripStyle.Visible
else:
_visible = ToolStripGripStyle.Hidden
self._toolbar.GripStyle = _visible
def girp_margin(self, margin):
if type(margin).__name__ == "list":
self._toolbar.GripMargin = Padding(margin[0], margin[1], margin[2], margin[3])
else:
self._toolbar.GripMargin = Padding(margin)
def create_button(self, text=None, image=None, on_click=None):
button = ToolStripButton()
if text is not None:
button.Text = text
if image is not None:
button.Image = Image.FromFile(image)
if on_click is not None:
button.Click += on_click
self._toolbar.Items.AddRange({button})
return button
def system(self, style=False):
if style:
self._toolbar.RenderMode = ToolStripRenderMode.System
else:
self._toolbar.RenderMode = ToolStripRenderMode.Professional
def show(self):
self.visible(True)
if self.side() == "top":
self.pack(side="top", fill="x", ipady=self._width / 2 - 1)
elif self.side() == "bottom":
self.pack(side="bottom", fill="x", ipady=self._width / 2 - 1)
elif self.side() == "left":
self.pack(side="left", fill="y", ipadx=self._width / 2 - 1)
elif self.side() == "right":
self.pack(side="right", fill="y", ipadx=self._width / 2 - 1)
if __name__ == '__main__':
from tkinter import Tkn
def click1(_1, _2):
print(_1)
print(_2)
root = Tk()
toolbar = ToolBar(side="top", width=25)
toolbar.create_button("Button 1", on_click=click1)
toolbar.create_button("Button 2", on_click=click1)
toolbar.show()
root.mainloop()
组件API
ToolBar
------ 基于WinForm
嵌入的工具栏。
create_button
------ 在工具栏创建一个按钮,text
按钮的文本 image
为按钮的图标文件地址 on_click
为按钮按下时的事件
grip
------ 设置工具栏手柄是否显示
grip_margin
------ 设置工具栏手柄的外边距,5
:值为单个数每个边缘都相同 [5, 5, 10, 10]
:值为列表需要4个数,左上右下顺序填写
side
------ 工具栏靠的方向,可设为top
bottom
left
right
show
------ 显示工具栏
system
------ 用于调整工具栏的绘制效果,True
则换一种绘制方法
width
------ 修改工具栏的宽度,如果side
属性为top
或bottom
则设为组件高度,如果为left
或right
则设为组件宽度