当我使用以下方式绘制形状时:
canvas.create_rectangle(10, 10, 50, 50, color="green")
Run Code Online (Sandbox Code Playgroud)
Tkinter是否记录了它的创建事实?
在我正在制作的一个简单游戏中,我的代码有一个Frame创建一堆矩形,然后绘制一个大的黑色矩形来清除屏幕,然后绘制另一组更新的矩形,依此类推.
我在内存中创建了数千个矩形对象吗?
我知道你可以将上面的代码分配给一个变量,但如果我不这样做,只是直接绘制到画布,它是否留在内存中,还是只是绘制像素,就像在HTML5画布中一样?
我一直在搞乱Tkinter Canvas小部件,看看我是否可以制作一些美观的小部件,我有几个问题.
首先,为什么我的Canvas小部件周围有一个浅灰色边框,我该如何摆脱它呢?
其次,为什么画布中最左边的位置(2,2)?看起来应该是(0,0).
我目前的剧本:
from Tkinter import *
master = Tk()
master.configure(bg='black')
master.wm_attributes("-topmost", 1)
w = Canvas(master, width=150, height=40, bd=0,relief='ridge',)
w.pack()
color = 100
x0 = 2
y0 = 2
x1 = 151
y1 = 2
while y0 < 20 :
r = color
g = color
b = color
rgb = r, g, b
Hex = '#%02x%02x%02x' % rgb
w.create_line(x0, y0, x1, y1,fill=str(Hex), width=1)
color = color - 2
y0 = y0 + 1
y1 …Run Code Online (Sandbox Code Playgroud) 此代码有效:
import tkinter
root = tkinter.Tk()
canvas = tkinter.Canvas(root)
canvas.grid(row = 0, column = 0)
photo = tkinter.PhotoImage(file = './test.gif')
canvas.create_image(0, 0, image=photo)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
它向我展示了图像.
现在,这段代码编译但它没有显示我的图像,我不知道为什么,因为它是相同的代码,在类中:
import tkinter
class Test:
def __init__(self, master):
canvas = tkinter.Canvas(master)
canvas.grid(row = 0, column = 0)
photo = tkinter.PhotoImage(file = './test.gif')
canvas.create_image(0, 0, image=photo)
root = tkinter.Tk()
test = Test(root)
root.mainloop()
Run Code Online (Sandbox Code Playgroud) 如果我使用画布来显示数据,并且我希望用户能够点击画布上的各种项目以获取更多信息或以某种方式与其进行交互,那么最好的方法是什么?
在线搜索我可以找到有关如何将事件绑定到标签的信息,但这似乎比我想要的更间接.我不想使用标签对项目进行分组,而是在用户单击画布上的特定项目时进行特定的函数调用.
我正在尝试使画布可滚动.但是,一旦我尝试设置滚动条以使用画布,tkinter似乎完全忽略了我最初为画布设置的尺寸.我已经尝试将它们全部打包在一个框架中,将画布设置为填充框架然后设置框架尺寸,但这会出现同样的问题,除非我将框架设置为填充窗口,这不是我想要的.基本上,我想要一个带有滚动条的固定大小的画布.我当前的代码看起来像这样(在python 3.1中):
from tkinter import *
root=Tk()
frame=Frame(root,width=300,height=300)
frame.grid(row=0,column=0)
canvas=Canvas(frame,bg='#FFFFFF',width=300,height=300,scrollregion=(0,0,500,500))
hbar=Scrollbar(canvas,orient=HORIZONTAL)
hbar.pack(side=BOTTOM,fill=X)
hbar.config(command=canvas.xview)
vbar=Scrollbar(canvas,orient=VERTICAL)
vbar.pack(side=RIGHT,fill=Y)
vbar.config(command=canvas.yview)
canvas.config(width=300,height=300)
canvas.config(xscrollcommand=hbar.set, yscrollcommand=vbar.set)
canvas.pack(side=LEFT,expand=True,fill=BOTH)
root.mainloop()
Run Code Online (Sandbox Code Playgroud) 所以我一直在使用tkinter中的canvas小部件来创建一个带有滚动条的标签框架.一切都很好,除了框架只扩展到放置在其中的标签的大小 - 我希望框架扩展到父画布的大小.
如果我在画布中使用pack(expand = True)(我已经在下面的代码中注释掉了),但是滚动条不起作用,这很容易就可以完成.
这是适当的代码:
self.canvas = Canvas(frame, bg = 'pink')
self.canvas.pack(side = RIGHT, fill = BOTH, expand = True)
self.mailbox_frame = Frame(self.canvas, bg = 'purple')
self.canvas.create_window((0,0),window=self.mailbox_frame, anchor = NW)
#self.mailbox_frame.pack(side = LEFT, fill = BOTH, expand = True)
mail_scroll = Scrollbar(self.canvas, orient = "vertical",
command = self.canvas.yview)
mail_scroll.pack(side = RIGHT, fill = Y)
self.canvas.config(yscrollcommand = mail_scroll.set)
self.mailbox_frame.bind("<Configure>", self.OnFrameConfigure)
def OnFrameConfigure(self, event):
self.canvas.configure(scrollregion=self.canvas.bbox("all"))
Run Code Online (Sandbox Code Playgroud)
我还提供了带彩色框架的图像,这样你就可以看到我所得到的东西.粉红色区域是需要通过mailbox_frame填充的画布(您可以看到右侧的滚动条):
谢谢
Tkinter的canvas小部件具有内置功能:
移动/与平移画布(例如用点击+拖拽)canvas.scan_mark和canvas.scan_dragto,看到这个问题
缩放画布上的矢量元素canvas.scale,但遗憾的是,这不适用于画布上的位图图像
幸运的是,此方法允许缩放图像(通过手动重绘图像的缩放部分).但:
当我们重新绘制画布的特定部分时,移动/平移功能将不再起作用...
我们绝对需要渲染超过当前显示的区域,以允许移动/平移.假设我们在画布上有1000x1000位图,我们想要缩放50倍...如何避免在内存中有50.000 x 50.000像素的位图?(RAM中2.5千兆像素太大).我们可以考虑仅渲染视口,或者比当前视口稍微多一点以允许平移,但是一旦平移导致渲染区域的边缘怎么办?
如何在Tkinter画布上使用移动/平移+缩放功能,适用于图像?
我正在使用Tkinter FigureCanvasTkagg绘制一些数据matplotlib.我需要清除图中我绘制数据的位置,并在按下按钮时绘制新数据.
这是代码的绘图部分(之前定义了一个App类):
self.fig = figure()
self.ax = self.fig.add_subplot(111)
self.ax.set_ylim( min(y), max(y) )
self.line, = self.ax.semilogx(x, y, '.-') #tuple of a single element
self.canvas = FigureCanvasTkAgg(self.fig, master=master)
self.ax.semilogx(x, y, 'o-')
self.canvas.show()
self.canvas.get_tk_widget().pack(side='top', fill='both', expand=1)
self.frame.pack()
Run Code Online (Sandbox Code Playgroud)
如何更新此类画布的内容?
我只是想知道是否有任何可能的方法将Click事件绑定到Tkinter中的画布.
我希望能够在画布上的任何位置单击并让对象移动到它.我能够制作动作,但我还没有找到一种方法来在画布上绑定click事件.
当我单击 tk 画布上的矩形时,我一直试图让函数运行。
这是代码:
from tkinter import *
window = Tk()
c = Canvas(window, width=300, height=300)
def clear():
canvas.delete(ALL)
playbutton = c.create_rectangle(75, 25, 225, 75, fill="red")
playtext = c.create_text(150, 50, text="Play", font=("Papyrus", 26), fill='blue')
c.pack()
window.mainloop()
Run Code Online (Sandbox Code Playgroud)
有谁知道我应该做什么?
python ×10
tkinter ×10
tkinter-canvas ×10
python-3.x ×2
canvas ×1
image ×1
python-2.7 ×1
scrollbar ×1
updating ×1