Python3 tkinter canvas,设置相对宽高
Python3 tkinter canvas, setting relative width and height
我正在尝试将某些 canvas 的宽度设置为母版(全屏)的宽度,并将高度设置为母版的 1/5、3/10 和 1/2。 Window 正确显示,但 canvas 未显示。我尝试使用 place() 而不是 pack() 并设置 relwidth = 1 和 relheight = 0.2,但没有成功。
我只希望我的三个 canvas 堆叠并水平填充 window.
master = Tk()
master.attributes('-zoomed', True)
w = master.winfo_width()
h = master.winfo_height()
hu = int(h/10)
h1 = hu*2
h2 = hu*3
h3 = hu*5
c1 = Canvas(master, bg='grey', width = w, height = h1)
c1.pack()
c2 = Canvas(master, bg='blue', width = w, height = h2)
c2.pack()
c3 = Canvas(master, bg='red', width = w, height = h3)
c3.pack()
编辑:我的工作代码现在是:
c1 = Canvas(master)
c1.place(rely = 0, relheight = 0.2, relwidth = 1)
c2 = Canvas(master)
c2.place(rely = 0.2, relheight = 0.3, relwidth = 1)
c3 = Canvas(master)
c3.place(rely = 0.5, relheight = 0.5, relwidth = 1)
但我有一个副作用,我无法在中心对齐文本:
c1.create_text(0, 0, text = 'text', fill = 'red', font = ('olivier', 30, 'bold'))
c1.update()
我用这种不优雅的方式解决了:
master.update_idletasks()
w = master.winfo_width()
h = master.winfo_height()
ww = int(w/2)
hh = int(h/10)
c1.create_text(ww, hh, text = 'text', fill = 'red')
您需要使用 .place()
几何管理器。
.place()
有两个我认为您需要的主要参数。
第一个是relheight
。顾名思义,它设置任何小部件相对于其父小部件的高度。
因此,如果 relheight
为 0.5,则高度将为 0.5(高度),或父控件高度的 50%。
这同样适用于 relwidth
,其工作方式相同,但适用于宽度。
详细了解 .place()
here。
此外,如果您需要代码:
master = Tk()
master.attributes('-zoomed', True)
c1 = Canvas(master, bg='grey')
c1.place(x = 0, rely = 0, relheight = 0.2, relwidth = 1)
c2 = Canvas(master, bg='blue')
c2.pack(x = 0, rely = 0.25, relheight = 0.3, relwidth = 1)
c3 = Canvas(master, bg='red')
c3.pack(x = 0, rely = 0.5, relheight = 0.5, relwidth = 1)
希望对您有所帮助!
编辑:.place()
不适用于 canvas 元素。为此,您需要取 canvas 的长度和宽度,然后将两者除以二(如果您想要中间)。
例如:
height = 100
width = 100
c = Canvas(master, bg = "blue", height = height, width = width, highlighthickness = 0)
c.place(x = 0, rely = 0.5, relheight = 0.2, relwidth = 1)
text = c.create_text(height/2, width/2, text = "text")
这会将文本 text
置于 canvas 的中心。
希望对您有所帮助!
第一次使用master.winfo_width()
和master.winfo_height()
时为零。(如果使用print(w,h)
,你会发现它们都是零。)
只需在master.winfo_xxxx
前加上master.update_idletasks()
即可。
所有代码可以是:
from tkinter import *
master = Tk()
master.state('zoomed')
# add here
master.update_idletasks()
w = master.winfo_width()
h = master.winfo_height()
hu = int(h/10)
h1 = hu*2
h2 = hu*3
h3 = hu*5
c1 = Canvas(master, bg='grey', width = w, height = h1)
c1.pack()
c2 = Canvas(master, bg='blue', width = w, height = h2)
c2.pack()
c3 = Canvas(master, bg='red', width = w, height = h3)
c3.pack()
master.mainloop()
我正在尝试将某些 canvas 的宽度设置为母版(全屏)的宽度,并将高度设置为母版的 1/5、3/10 和 1/2。 Window 正确显示,但 canvas 未显示。我尝试使用 place() 而不是 pack() 并设置 relwidth = 1 和 relheight = 0.2,但没有成功。 我只希望我的三个 canvas 堆叠并水平填充 window.
master = Tk()
master.attributes('-zoomed', True)
w = master.winfo_width()
h = master.winfo_height()
hu = int(h/10)
h1 = hu*2
h2 = hu*3
h3 = hu*5
c1 = Canvas(master, bg='grey', width = w, height = h1)
c1.pack()
c2 = Canvas(master, bg='blue', width = w, height = h2)
c2.pack()
c3 = Canvas(master, bg='red', width = w, height = h3)
c3.pack()
编辑:我的工作代码现在是:
c1 = Canvas(master)
c1.place(rely = 0, relheight = 0.2, relwidth = 1)
c2 = Canvas(master)
c2.place(rely = 0.2, relheight = 0.3, relwidth = 1)
c3 = Canvas(master)
c3.place(rely = 0.5, relheight = 0.5, relwidth = 1)
但我有一个副作用,我无法在中心对齐文本:
c1.create_text(0, 0, text = 'text', fill = 'red', font = ('olivier', 30, 'bold'))
c1.update()
我用这种不优雅的方式解决了:
master.update_idletasks()
w = master.winfo_width()
h = master.winfo_height()
ww = int(w/2)
hh = int(h/10)
c1.create_text(ww, hh, text = 'text', fill = 'red')
您需要使用 .place()
几何管理器。
.place()
有两个我认为您需要的主要参数。
第一个是relheight
。顾名思义,它设置任何小部件相对于其父小部件的高度。
因此,如果 relheight
为 0.5,则高度将为 0.5(高度),或父控件高度的 50%。
这同样适用于 relwidth
,其工作方式相同,但适用于宽度。
详细了解 .place()
here。
此外,如果您需要代码:
master = Tk()
master.attributes('-zoomed', True)
c1 = Canvas(master, bg='grey')
c1.place(x = 0, rely = 0, relheight = 0.2, relwidth = 1)
c2 = Canvas(master, bg='blue')
c2.pack(x = 0, rely = 0.25, relheight = 0.3, relwidth = 1)
c3 = Canvas(master, bg='red')
c3.pack(x = 0, rely = 0.5, relheight = 0.5, relwidth = 1)
希望对您有所帮助!
编辑:.place()
不适用于 canvas 元素。为此,您需要取 canvas 的长度和宽度,然后将两者除以二(如果您想要中间)。
例如:
height = 100
width = 100
c = Canvas(master, bg = "blue", height = height, width = width, highlighthickness = 0)
c.place(x = 0, rely = 0.5, relheight = 0.2, relwidth = 1)
text = c.create_text(height/2, width/2, text = "text")
这会将文本 text
置于 canvas 的中心。
希望对您有所帮助!
第一次使用master.winfo_width()
和master.winfo_height()
时为零。(如果使用print(w,h)
,你会发现它们都是零。)
只需在master.winfo_xxxx
前加上master.update_idletasks()
即可。
所有代码可以是:
from tkinter import *
master = Tk()
master.state('zoomed')
# add here
master.update_idletasks()
w = master.winfo_width()
h = master.winfo_height()
hu = int(h/10)
h1 = hu*2
h2 = hu*3
h3 = hu*5
c1 = Canvas(master, bg='grey', width = w, height = h1)
c1.pack()
c2 = Canvas(master, bg='blue', width = w, height = h2)
c2.pack()
c3 = Canvas(master, bg='red', width = w, height = h3)
c3.pack()
master.mainloop()