【tkinter】Windows下工具栏实现

需要安装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属性为topbottom则设为组件高度,如果为leftright则设为组件宽度

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值