Python Tkinter:在初始化期间获取实际画布大小(包括通过“sticky”自动拉伸)
在程序初始化期间,我试图将一些文本集中在画布上。但是,在这种情况下,winfo_width/height不会为我返回正确的值,因此我无法使用Canvas方法create_text()正确放置文本,因为我无法计算正确的中心位置。我只能在init之后获得正确的维度,比如在按钮回调中查询大小 如何解决这个问题?代码如下:Python Tkinter:在初始化期间获取实际画布大小(包括通过“sticky”自动拉伸),python,canvas,tkinter,initialization,dimensions,Python,Canvas,Tkinter,Initialization,Dimensions,在程序初始化期间,我试图将一些文本集中在画布上。但是,在这种情况下,winfo_width/height不会为我返回正确的值,因此我无法使用Canvas方法create_text()正确放置文本,因为我无法计算正确的中心位置。我只能在init之后获得正确的维度,比如在按钮回调中查询大小 如何解决这个问题?代码如下: try: from Tkinter import * except ImportError: from tkinter import * class GUI:
try:
from Tkinter import *
except ImportError:
from tkinter import *
class GUI:
def __init__(self):
# root window of the whole program
self.root = Tk()
self.root.minsize(800, 600)
# canvas/viewport for displaying the image and drawing vectors on it
self.viewport = Canvas(self.root, bd=2, relief='ridge', highlightthickness=0)
# define master buttons for audio preview, render to file and clear all vectors
btn_preview = Button(self.root, text='Preview', command=self.Preview)
# layout managing
self.viewport.grid(columnspan=3, padx=5, pady=5, sticky=N+S+W+E)
btn_preview.grid(row=1, padx=85, pady=10, ipadx=5, ipady=5, sticky=W)
# position text on canvas to notify user he can load the image by clicking it
self.viewport.update_idletasks()
textpos = (self.viewport.winfo_width(),self.viewport.winfo_height())
print(textpos)
self.viewport.create_text(textpos[0] / 2, textpos[1] / 2, text="Click here to load an image!", justify='center', font='arial 20 bold')
# weights of rows and columns
self.root.rowconfigure(0, weight=1)
self.root.columnconfigure(0, weight=1)
def Preview(self, event=None):
textpos = (self.viewport.winfo_width(),self.viewport.winfo_height())
print(textpos)
if __name__ == '__main__':
mainwindow = GUI()
mainloop()
将init上返回的维度与单击预览按钮后的维度进行比较。他们不一样 好的,哈哈,我查过之后就解决了。我需要将
事件绑定到画布,并定义一个在调整窗口大小时执行填充操作的函数。现在开始工作了
try:
from Tkinter import *
except ImportError:
from tkinter import *
class GUI:
textid = 0
def __init__(self):
# root window of the whole program
self.root = Tk()
self.root.minsize(800, 600)
# canvas/viewport for displaying the image and drawing vectors on it
self.viewport = Canvas(self.root, bd=2, relief='ridge', highlightthickness=0)
# define master buttons for audio preview, render to file and clear all vectors
btn_preview = Button(self.root, text='Preview', command=self.Preview)
# layout managing
self.viewport.grid(columnspan=3, padx=5, pady=5, sticky=N+S+W+E)
btn_preview.grid(row=1, padx=85, pady=10, ipadx=5, ipady=5, sticky=W)
# weights of rows and columns
self.root.rowconfigure(0, weight=1)
self.root.columnconfigure(0, weight=1)
# bind mouse actions for the canvas
self.viewport.bind('<Configure>', self.ResizeCanvas)
def Preview(self, event=None):
textpos = (self.viewport.winfo_width(),self.viewport.winfo_height())
print(textpos)
def ResizeCanvas(self, event):
if self.textid != 0:
event.widget.delete('openfiletext')
# position text on canvas to notify user he can load the image by clicking it
textpos = (self.viewport.winfo_width(), self.viewport.winfo_height())
self.textid = self.viewport.create_text(textpos[0] / 2, textpos[1] / 2, text="Click here to load an image!", justify='center', font='arial 20 bold', tag='openfiletext')
if __name__ == '__main__':
mainwindow = GUI()
mainloop()
试试看:
从Tkinter进口*
除恐怖外:
从tkinter进口*
类GUI:
textid=0
定义初始化(自):
#整个程序的根窗口
self.root=Tk()
self.root.minsize(800600)
#画布/视口,用于显示图像及其上的图形向量
self.viewport=Canvas(self.root,bd=2,relief='ridge',highlightthickness=0)
#定义音频预览、渲染到文件和清除所有矢量的主按钮
btn_preview=按钮(self.root,text='preview',command=self.preview)
#布局管理
self.viewport.grid(columnspan=3,padx=5,pady=5,sticky=N+S+W+E)
btn_preview.grid(行=1,padx=85,pady=10,ipadx=5,ipady=5,粘性=W)
#行和列的权重
self.root.rowconfigure(0,权重=1)
self.root.columnconfigure(0,权重=1)
#为画布绑定鼠标操作
self.viewport.bind(“”,self.ResizeCanvas)
def预览(自身,事件=无):
textpos=(self.viewport.winfo_width(),self.viewport.winfo_height())
打印(textpos)
def ResizeCanvas(自身、事件):
如果self.textid!=0:
event.widget.delete('openfiletext')
#将文本放置在画布上,通知用户可以通过单击来加载图像
textpos=(self.viewport.winfo_width(),self.viewport.winfo_height())
self.textid=self.viewport.create_text(textpos[0]/2,textpos[1]/2,text=“单击此处加载图像!”,justify='center',font='arial 20 bold',tag='openfiletext')
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
mainwindow=GUI()
mainloop()