gpt4 book ai didi

python - Tkinter 自定义窗口

转载 作者:行者123 更新时间:2023-11-28 23:00:32 25 4
gpt4 key购买 nike

我想在 Tk 中创建一个具有自定义标题栏和框架的窗口。我在这个网站上看到了很多关于这个问题的问题,但我正在寻找的是使用 Canvas 实际渲染框架,然后将内容添加到 Canvas 。我不能使用框架来执行此操作,因为边框是渐变的。

根据本网站:http://effbot.org/tkinterbook/canvas.htm#Tkinter.Canvas.create_window-method ,我不能将任何其他 Canvas 项目放在小部件之上(使用 create_window 方法),但我需要这样做,因为我的一些小部件是使用 Canvas 呈现的。

关于如何做到这一点有什么建议吗?我在这里一无所知。

编辑:Bryan Oakley 确认用 Canvas 渲染是不可能的。那么是否可以使用自定义边框颜色的框架?如果是这样,有人可以举一个简单的例子吗?我是 Python 的新手。

最佳答案

您可以像使用框架一样使用 Canvas 来绘制您自己的窗口边框。但是,正如您所说,您不能在嵌入 Canvas 的小部件之上绘制 Canvas 项目;小部件始终具有最高的堆叠顺序。没有办法解决这个问题,但不清楚您是否真的需要这样做。

这里有一个简单粗暴的例子,展示了如何为自定义边框创建一个带有渐变的窗口。为了使示例简短,我没有添加任何代码来允许您移动窗口或调整窗口大小。此外,它为渐变使用固定颜色。

import Tkinter as tk

class GradientFrame(tk.Canvas):
'''A gradient frame which uses a canvas to draw the background'''
def __init__(self, parent, borderwidth=1, relief="sunken"):
tk.Canvas.__init__(self, parent, borderwidth=borderwidth, relief=relief)
self._color1 = "red"
self._color2 = "black"
self.bind("<Configure>", self._draw_gradient)

def _draw_gradient(self, event=None):
'''Draw the gradient'''
self.delete("gradient")
width = self.winfo_width()
height = self.winfo_height()
limit = width
(r1,g1,b1) = self.winfo_rgb(self._color1)
(r2,g2,b2) = self.winfo_rgb(self._color2)
r_ratio = float(r2-r1) / limit
g_ratio = float(g2-g1) / limit
b_ratio = float(b2-b1) / limit

for i in range(limit):
nr = int(r1 + (r_ratio * i))
ng = int(g1 + (g_ratio * i))
nb = int(b1 + (b_ratio * i))
color = "#%4.4x%4.4x%4.4x" % (nr,ng,nb)
self.create_line(i,0,i,height, tags=("gradient",), fill=color)
self.lower("gradient")

class SampleApp(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.wm_overrideredirect(True)
gradient_frame = GradientFrame(self)
gradient_frame.pack(side="top", fill="both", expand=True)
inner_frame = tk.Frame(gradient_frame)
inner_frame.pack(side="top", fill="both", expand=True, padx=8, pady=(16,8))

b1 = tk.Button(inner_frame, text="Close",command=self.destroy)
t1 = tk.Text(inner_frame, width=40, height=10)
b1.pack(side="top")
t1.pack(side="top", fill="both", expand=True)

if __name__ == "__main__":
app = SampleApp()
app.mainloop()

关于python - Tkinter 自定义窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11892521/

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