gpt4 book ai didi

python - 在 tkinter 中更改滚动条的外观(使用 ttk 样式)

转载 作者:太空狗 更新时间:2023-10-29 20:24:10 27 4
gpt4 key购买 nike

我想知道您是否可以帮我解决 ttk 中的样式选项问题。我已经设法将大部分基本的 ttk 小部件更改为我喜欢的样式。我只是停留在改变滚动条的样式上。我已经搜索了几个小时寻找答案,不幸的是无济于事。

这是使用滚动条样式选项的示例代码:

import tkinter as tk                 
from tkinter import ttk

class Gui:
def __init__(self,mainframe):

#set the style
style = ttk.Style()
style.configure('Horizontal.TScrollbar',background = "blue" )

#Create a mainframe
self.mainframe = mainframe
self.mainframe.title("example")


#creating scrollbar frame
scrl_attr_frame = ttk.Frame(self.mainframe)
scrl_attr_frame.grid(column=0,row=5,sticky="ns")
scrl_attr_frame.rowconfigure(0, weight=1)
attr_canvas = tk.Canvas(scrl_attr_frame)
h_scroll = ttk.Scrollbar(scrl_attr_frame,orient="horizontal", command=attr_canvas.xview)
attr_canvas.configure(xscrollcommand=h_scroll.set)
attr_canvas.grid(column=0,row=0,sticky="ns")
h_scroll.grid(column=0, row=1,sticky="we")
attr_frame = ttk.Frame(attr_canvas)
attr_frame.grid(column=0,row=0,sticky="ns")
attr_canvas.create_window((0,0),window=attr_frame, anchor='nw')
attr_frame.bind("<Configure>",lambda event, canvas=attr_canvas : canvas.configure(scrollregion=canvas.bbox("all"),width=200,height=200,takefocus=False,highlightthickness=0))#attribute_frame.winfo_height()/20,highlightthickness=0))

#setup treeview widget
tree_columns = ("c1", "c2", "c3")

self.tree = ttk.Treeview(attr_frame,columns=tree_columns, show="headings",takefocus=False)
self.tree.grid(column=0, row=0, sticky='nsew')

for head in tree_columns:
self.tree.heading(head,text=head,anchor="w")


root = tk.Tk()
myapp = Gui(root)
root.mainloop()

我还尝试了几种组合,包括;

style.configure('TScrollbar',background='blue') 

#and
style.configure('CustomScroll.Horizontal.TScrollbar',background='blue')

#in combination with
h_scroll = ttk.Scrollbar(scrl_attr_frame,orient="horizontal", command=attr_canvas.xview)
h_scroll['style'] = "CustomScroll.Horizontal.TScrollbar"

非常感谢您的帮助!

最佳答案

看起来您只是想更改 Windows 主题下水平滚动条的槽。 ttk 小部件由样式引擎提供的一组元素构成,并使用声明的布局进行组合。在 Windows 下,样式引擎是 Windows Visual Styles API,这意味着程序员无法控制用于绘制大多数常见元素的颜色或图像。按钮背景、滚动条槽和按钮以及拇指甚至滚动条拇指内部绘制的 handle 都是Windows提供的。

可以控制此应用程序自定义,但代价是使您的应用程序在给定平台上看起来不再是标准的。为此,您必须提供自己的 UI 元素并定义新的小部件布局。最终这可以变成定义您自己的主题。 ttk 库中的 tcl 脚本提供了很好的示例,甚至有一些完整的(如果是旧的)主题使用位图在 ttk 的原始版本中声明基于图像的主题元素,称为“tile”。

在这个特定的例子中,为了获得一个带有自定义彩色背景的 Windows 水平滚动条,我们需要重新定义布局以使用来自 Tk 绘制元素的滚动条槽。 “默认”主题中使用的元素可以被复制并使用样式配置参数定义,然后由 Tk 本身绘制,而不是传递给第三方引擎。以下代码生成这样的滚动条,它使用 vsapi 样式引擎提供的标准按钮和拇指,但替换了槽。这个导入的槽理解 troughcolor 样式配置选项,因此我们现在可以定义要使用的颜色。所有使用此样式的滚动条都将使用相同的颜色,因为小部件本身不会接受 troughcolor 选项。即:除非您为每种新颜色定义新样式,否则不能让一个滚动条为蓝色而另一个为红色。

enter image description here

from tkinter import *
from tkinter.ttk import *

def main():
app = Tk()
style = Style()

# import the 'trough' element from the 'default' engine.
style.element_create("My.Horizontal.Scrollbar.trough", "from", "default")

# Redefine the horizontal scrollbar layout to use the custom trough.
# This one is appropriate for the 'vista' theme.
style.layout("My.Horizontal.TScrollbar",
[('My.Horizontal.Scrollbar.trough', {'children':
[('Horizontal.Scrollbar.leftarrow', {'side': 'left', 'sticky': ''}),
('Horizontal.Scrollbar.rightarrow', {'side': 'right', 'sticky': ''}),
('Horizontal.Scrollbar.thumb', {'unit': '1', 'children':
[('Horizontal.Scrollbar.grip', {'sticky': ''})],
'sticky': 'nswe'})],
'sticky': 'we'})])
# Copy original style configuration and add our new custom configuration option.
style.configure("My.Horizontal.TScrollbar", *style.configure("Horizontal.TScrollbar"))
style.configure("My.Horizontal.TScrollbar", troughcolor="red")

# Create and show a widget using the custom style
hs = Scrollbar(app, orient="horizontal", style="My.Horizontal.TScrollbar")
hs.place(x=5, y=5, width=150)
hs.set(0.2,0.3)

app.mainloop()

if __name__ == '__main__':
main()

关于python - 在 tkinter 中更改滚动条的外观(使用 ttk 样式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28375591/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com