Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 调整Tkinter窗口大小时的行位置_Python_Python 3.x_Tkinter_Python 3.6 - Fatal编程技术网

Python 调整Tkinter窗口大小时的行位置

Python 调整Tkinter窗口大小时的行位置,python,python-3.x,tkinter,python-3.6,Python,Python 3.x,Tkinter,Python 3.6,以下代码: from tkinter import * root=Tk() for x in range(10): for y in range(10): canvas=Canvas(root, width='15',height='15',highlightthickness=0,bg='red') canvas.create_line(canvas.winfo_x(),canvas.winfo_y(),can

以下代码:

from tkinter import *
root=Tk()
for x in range(10):
    for y in range(10):
        canvas=Canvas(root, width='15',height='15',highlightthickness=0,bg='red')                      
        canvas.create_line(canvas.winfo_x(),canvas.winfo_y(),canvas.winfo_x()+15,canvas.winfo_y()+15,width=2,fill='black')
        canvas.grid(row=y,column=x,sticky='NESW')
for x in range(10):
    for y in range(10):
        root.columnconfigure(x,weight=1)
        root.rowconfigure(y,weight=1)
root.mainloop()
生产,这是一个10乘10网格充满画布;有一条线从每个画布的左上角延伸到右下角

当我调整窗口大小时,画布小部件可以正确调整大小,但线条保持其形状。行需要根据窗口/小部件大小进行调整


问题的核心是,这些线是使用小部件左上角的坐标绘制的,并且在每个方向上扩展了15个像素。是否有一种方法可以获取小部件右下角的坐标,以便线条可以动态更改其形状,或者有其他方法可以保持线条形状,相对于小部件?

您可以使用winfo_width和winfo_height方法获取任何小部件的当前宽度和高度。如果绑定到画布更改大小时要跟踪的方法,则事件对象具有宽度和高度属性

例如:

from tkinter import *

def redraw_line(event):
    width = event.width
    height = event.height
    canvas = event.widget
    canvas.coords("diagonal", 0, 0, width, height)

root=Tk()
for x in range(10):
    for y in range(10):
        canvas=Canvas(root, width='15',height='15',highlightthickness=0,bg='red')                      
        canvas.bind("<Configure>", redraw_line)
        # coordinates are irrelevant; they will change as soon as
        # the widget is mapped to the screen.
        canvas.create_line(0,0,0,0, tags=("diagonal",))
        canvas.grid(row=y,column=x,sticky='NESW')

for x in range(10):
    for y in range(10):
        root.columnconfigure(x,weight=1)
        root.rowconfigure(y,weight=1)


root.mainloop()