Python Tkinter:在初始化期间获取实际画布大小(包括通过“sticky”自动拉伸)

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:

在程序初始化期间,我试图将一些文本集中在画布上。但是,在这种情况下,winfo_width/height不会为我返回正确的值,因此我无法使用Canvas方法create_text()正确放置文本,因为我无法计算正确的中心位置。我只能在init之后获得正确的维度,比如在按钮回调中查询大小

如何解决这个问题?代码如下:

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()