如何使 tkinter 的 GUI 组件动态化?
How to make tkinter's GUI components dynamic?
我正在为 Windows 制作一个 tkinter 应用程序,我想使小部件的位置动态化。和this picture, the Label
(which is acting like a background image holder), is covering the Y-axis, but when I maximize the window, like here一样,照片没有覆盖整个Y轴。
如何解决这个问题,或者有没有办法在不使用 root.overridedirect()
的情况下禁用 windows' 最大化按钮?
这是代码 →
#importing everything
from tkinter import *
from pypresence import Presence
import time
#making the root window
root = Tk()
dimension = (
800,
500
)
#setting the window
bg = PhotoImage(file = r'C:\Users\Hunter\Desktop\school 1\module\pbm\bg.png')
background = Label(root, bd=0, image=bg)
background.place(x=0, y=0, relwidth=1, relheight=1)
root.geometry(f'{dimension[0]}x{dimension[1]}')
#main thing
root.mainloop()
您可以通过绑定事件处理函数来做您想做的事,这样只要 root
window <Configure>
事件发生,它就会被调用。这将允许您在根 window 移动或调整大小时更改附加在 Label
上的图像的大小。
在下面的代码中,PIL
(Python 图像库)的 Pillow fork 用于调整图像大小,因为 tkinter
不提供这样做的本机方式。原始图像是单独存储的,将它放在 Label
上需要完成的所有缩放总是相对于它的大小。这可以防止错误累积和降低显示图像的质量。
请注意,我还将您的 from tkinter import *
更改为 import tkinter as tk
,因为 tkinter.Image
和 PIL.Image
之间存在冲突。通常最好避免 import *
以防止这种情况发生。
from PIL import Image, ImageTk
import tkinter as tk
import time
DIMENSION = 800, 500
def config_callback(event):
global bg
window_w, window_h = root.winfo_width(), root.winfo_height()
# New height of image is original height * ratio of current to starting size of window.
new_height = round(orig_height * (window_h/DIMENSION[1]))
# Resize original image to this new size (without changing width).
bg = ImageTk.PhotoImage(orig_img.resize((orig_width, new_height), Image.ANTIALIAS))
background.config(image=bg)
root = tk.Tk()
#image_path = r'C:\Users\Hunter\Desktop\school 1\module\pbm\bg.png'
image_path = r'.\bkgr.png'
orig_img = Image.open(image_path)
orig_width, orig_height = orig_img.size
bg = ImageTk.PhotoImage(orig_img.resize((orig_width, orig_height), Image.ANTIALIAS))
background = tk.Label(root, bd=0, image=bg)
background.place(x=0, y=0, relwidth=1, relheight=1)
root.geometry(f'{DIMENSION[0]}x{DIMENSION[1]}')
root.bind('<Configure>', config_callback) # Callback on window move/resize
root.mainloop()
这是显示原始外观的屏幕截图:
这是另一个显示更改 window 高度后的样子:
我正在为 Windows 制作一个 tkinter 应用程序,我想使小部件的位置动态化。和this picture, the Label
(which is acting like a background image holder), is covering the Y-axis, but when I maximize the window, like here一样,照片没有覆盖整个Y轴。
如何解决这个问题,或者有没有办法在不使用 root.overridedirect()
的情况下禁用 windows' 最大化按钮?
这是代码 →
#importing everything
from tkinter import *
from pypresence import Presence
import time
#making the root window
root = Tk()
dimension = (
800,
500
)
#setting the window
bg = PhotoImage(file = r'C:\Users\Hunter\Desktop\school 1\module\pbm\bg.png')
background = Label(root, bd=0, image=bg)
background.place(x=0, y=0, relwidth=1, relheight=1)
root.geometry(f'{dimension[0]}x{dimension[1]}')
#main thing
root.mainloop()
您可以通过绑定事件处理函数来做您想做的事,这样只要 root
window <Configure>
事件发生,它就会被调用。这将允许您在根 window 移动或调整大小时更改附加在 Label
上的图像的大小。
在下面的代码中,PIL
(Python 图像库)的 Pillow fork 用于调整图像大小,因为 tkinter
不提供这样做的本机方式。原始图像是单独存储的,将它放在 Label
上需要完成的所有缩放总是相对于它的大小。这可以防止错误累积和降低显示图像的质量。
请注意,我还将您的 from tkinter import *
更改为 import tkinter as tk
,因为 tkinter.Image
和 PIL.Image
之间存在冲突。通常最好避免 import *
以防止这种情况发生。
from PIL import Image, ImageTk
import tkinter as tk
import time
DIMENSION = 800, 500
def config_callback(event):
global bg
window_w, window_h = root.winfo_width(), root.winfo_height()
# New height of image is original height * ratio of current to starting size of window.
new_height = round(orig_height * (window_h/DIMENSION[1]))
# Resize original image to this new size (without changing width).
bg = ImageTk.PhotoImage(orig_img.resize((orig_width, new_height), Image.ANTIALIAS))
background.config(image=bg)
root = tk.Tk()
#image_path = r'C:\Users\Hunter\Desktop\school 1\module\pbm\bg.png'
image_path = r'.\bkgr.png'
orig_img = Image.open(image_path)
orig_width, orig_height = orig_img.size
bg = ImageTk.PhotoImage(orig_img.resize((orig_width, orig_height), Image.ANTIALIAS))
background = tk.Label(root, bd=0, image=bg)
background.place(x=0, y=0, relwidth=1, relheight=1)
root.geometry(f'{DIMENSION[0]}x{DIMENSION[1]}')
root.bind('<Configure>', config_callback) # Callback on window move/resize
root.mainloop()
这是显示原始外观的屏幕截图:
这是另一个显示更改 window 高度后的样子: