这里是一个粗略的例子,其中的框架,标题栏和关闭按钮都用帆布矩形制作:
import Tkinter as tk
class Application(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
# Get rid of the os' titlebar and frame
self.overrideredirect(True)
self.mCan = tk.Canvas(self, height=768, width=768)
self.mCan.pack()
# Frame and close button
self.lFrame = self.mCan.create_rectangle(0,0,9,769,
outline='lightgrey', fill='lightgrey')
self.rFrame = self.mCan.create_rectangle(760,0,769,769,
outline='lightgrey', fill='lightgrey')
self.bFrame = self.mCan.create_rectangle(0,760,769,769,
outline='lightgrey', fill='lightgrey')
self.titleBar = self.mCan.create_rectangle(0,0,769,20,
outline='lightgrey', fill='lightgrey')
self.closeButton = self.mCan.create_rectangle(750,4,760, 18,
activefill='red', fill='darkgrey')
# Binds
self.bind('<1>', self.left_mouse)
self.bind('<Escape>', self.close_win)
# Center the window
self.update_idletasks()
xp = (self.winfo_screenwidth()/2) - (self.winfo_width()/2)
yp = (self.winfo_screenheight()/2) - (self.winfo_height()/2)
self.geometry('{0}x{1}+{2}+{3}'.format(self.winfo_width(),
self.winfo_height(),
xp, yp))
def left_mouse(self, event=None):
obj = self.mCan.find_closest(event.x,event.y)
if obj[0] == self.closeButton:
self.destroy()
def close_win(self, event=None):
self.destroy()
app = Application()
app.mainloop()
如果我要做出一个自定义GUI框架,我会考虑用图像创建它,
使用像Photoshop一样的程序,而不是呈现画布对象。
图像可以被放置在画布上是这样的:
self.ti = tk.PhotoImage(file='test.gif')
self.aImage = mCanvas.create_image(0,0, image=self.ti,anchor='nw')
更多信息→here←
我不明白的问题,你的编辑使它更加明确。是的,可以使用画布创建带有自定义边框的框架。这与在小部件顶部绘制画布项无关 - 这是两个不同的问题。 – 2012-08-10 01:53:38
我以为有bordercolor属性......这不适用于顶级框架,对吧? – MiJyn 2012-08-10 02:06:44
我没有确认“用画布渲染是不可能的”。我只是确认,您不能在画布中嵌入的小部件顶部绘制画布项目。当然,您可以使用画布呈现边框和自定义标题栏。 – 2012-08-10 02:12:01