簡體   English   中英

頂層背景圖像調整 Window 和 Tkinter

[英]Background Image Adjustment on Top Level Window with Tkinter

我有一個基本的 GUI,它以各種主菜單開頭。 我已成功為該菜單設置了背景圖像,並且當我更改 GUI window 的尺寸時它也會縮放。 但是,當我嘗試定義由子菜單項打開的一些頂級 windows 時,背景圖像不會出現(更不用說比例)。 不知道我做錯了什么,但我附上了我編寫的代碼以及基本 GUI 的圖像。

from tkinter import *
from tkinter import ttk, font, messagebox
from PIL import ImageTk, Image
import os

root = Tk()
root.title("Decoder of ultrasound images to detect colon tumors")
# Adding window icon
root.iconbitmap('afekaImage.ico')

rootWidth, rootHeight = 600, 600

screenWidth = root.winfo_screenwidth()
screenHeight = root.winfo_screenheight()

topLeftPosition = (screenWidth / 2 - rootWidth / 2, screenHeight / 2 - rootHeight / 2)

# Configure window size
root.geometry(f'{rootWidth}x{rootHeight}+{int(topLeftPosition[0])}+{int(topLeftPosition[1])}')


'''
# Create username & password entry
def entryDialog():
    userName = entry1.get()
    password = entry2.get()
    if ((userName == 'Itzhak.Mamistvalov' and  password == '311396832') or
            (userName == 'AssafHasky' and password == '308333533')):
        messagebox.showinfo('info', 'Correct Login')
    else:
        messagebox.showinfo('info', 'Invalid Login') '''


# open doc file
def openDocFile():
    os.startfile("mid_sub.docx")


# adjusting background image to fit window
def adjustBackgroundImage(event):
    # avoid garbage collection option 1
    # global resizedBackgroundImage, newBackgroundImage
    # ----------
    width = event.width
    height = event.height
    resizedBackgroundImage = copyImage.resize((width, height))
    newBackgroundImage = ImageTk.PhotoImage(resizedBackgroundImage)
    label.config(image=newBackgroundImage)
    # avoid garbage collection option 2
    label.image = newBackgroundImage
    # ----------


def createUserManualWindow(button_userManual):
    global image1
    userManualWindow = Toplevel(root)

    def activateButtonUserManual():
        button_userManual.configure(state="normal")
        userManualWindow.destroy()

    button_userManual.configure(state="disabled")
    button_exit_userManualWindow = Button(userManualWindow, text="Exit", font=fontStyle,
                                          command=lambda: [userManualWindow.destroy(), activateButtonUserManual()])
    button_exit_userManualWindow.place(relx=0.4, rely=0.8, relwidth=0.2, relheight=0.1)
    # will occurs only when esc pressed
    userManualWindow.protocol("WM_DELETE_WINDOW", activateButtonUserManual)
    # ----------
    userManualWindow.geometry(f'{rootWidth}x{rootHeight}+{int(topLeftPosition[0])}+{int(topLeftPosition[1])}')
    userManualWindow.iconbitmap('afekaImage.ico')
    image1 = ImageTk.PhotoImage(Image.open('background.jpg'))
    label1 = ttk.Label(userManualWindow, image=image1).pack()
    label1.bind('<Configure>', adjustBackgroundImage)
    label1.pack(fill=BOTH, expand=YES)

def createOverviewWindow(button_userManual):
    overviewWindow = Toplevel(root)

    def activateButtonOverview():
        button_userManual.configure(state="normal")
        overviewWindow.destroy()

    button_userManual.configure(state="disabled")
    button_exit_OverviewWindow = Button(overviewWindow, text="Exit", font=fontStyle,
                                          command=lambda: [overviewWindow.destroy(), activateButtonOverview()])
    button_exit_OverviewWindow.place(relx=0.4, rely=0.8, relwidth=0.2, relheight=0.1)
    # will occurs only when esc pressed
    overviewWindow.protocol("WM_DELETE_WINDOW", activateButtonOverview)
    # ----------
    overviewWindow.geometry(f'{rootWidth}x{rootHeight}+{int(topLeftPosition[0])}+{int(topLeftPosition[1])}')
    overviewWindow.iconbitmap('afekaImage.ico')


# Define background image
image = Image.open('background.jpg')
copyImage = image.copy()
backgroundImage = ImageTk.PhotoImage(image)
label = ttk.Label(root, image=backgroundImage)
label.bind('<Configure>', adjustBackgroundImage)
label.pack(fill=BOTH, expand=YES)

# Configure font
fontStyle = font.Font(family="Segoe Script", size=10, weight=font.BOLD)

# Create buttons
button_userManual = Button(root, text="USER MANUAL", command=lambda: createUserManualWindow(button_userManual), font=fontStyle)
button_userManual.place(relx=0.4, rely=0.2, relwidth=0.2, relheight=0.1)

button_overview = Button(root, text="OVERVIEW", command=lambda: createOverviewWindow(button_overview), font=fontStyle)
button_overview.place(relx=0.4, rely=0.4, relwidth=0.2, relheight=0.1)

button_openDocFile = Button(root, text="DOC FILE", font=fontStyle, command=openDocFile)
button_openDocFile.place(relx=0.4, rely=0.6, relwidth=0.2, relheight=0.1)

button_quit = Button(root, text="Exit", font=fontStyle, command=root.destroy)
button_quit.place(relx=0.4, rely=0.8, relwidth=0.2, relheight=0.1)

root.mainloop()

在此處輸入圖像描述

  1. label1 = ttk.Label(userManualWindow, image=image1).pack()應改為:
label1 = ttk.Label(userManualWindow, image=image1)
label1.pack()
  1. 您應該在放置“退出”按鈕之前調用label1.pack() ,否則它將重疊/隱藏“退出”按鈕。 或者在 label1.pack label1.lower() label1.pack()

  2. labeladjustBackgroundImage()內部使用,因此即使您將label1上的<configure>綁定到adjustBackgroundImage() ,它也不會調整label1顯示的圖像大小。 adjustBackgroundImage()中使用event.widget而不是label

def adjustBackgroundImage(event):
    label = event.widget
    # avoid garbage collection option 1
    # global resizedBackgroundImage, newBackgroundImage
    # ----------
    width = event.width
    height = event.height
    resizedBackgroundImage = copyImage.resize((width, height))
    newBackgroundImage = ImageTk.PhotoImage(resizedBackgroundImage)
    label.config(image=newBackgroundImage)
    # avoid garbage collection option 2
    label.image = newBackgroundImage
    # ----------

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM