Фон не огибает кнопку

#python #tkinter

Вопрос:

Я использую tkinter для создания графического интерфейса. Я использую PIL для импорта изображения в качестве фона. Вот мой код:

 root = tk.Tk()
root.title("DFUInfo-v1")
img = ImageTk.PhotoImage(Image.open("background.jpg"))  
l=Label(image=img)
l.pack()
root.configure(bg='white')   

root.geometry("490x280")
 

В моем приложении кнопки округлены. Но когда я использую изображение, фон не соответствует круглым кнопкам, вот изображение:

Кто-нибудь может мне помочь, пожалуйста? Спасибо

Комментарии:

1. Label не имеет закругленных углов (насколько я знаю). Таким образом, даже если изображение округлое, оно не будет отражаться в tk.Label

2. итак, знаете ли вы, какой модуль может это сделать

3. Какой модуль может округлять кнопки?

4. используйте другой фреймворк, такой как PyQt или PyGTK.

5. @Art не обязательно, вы можете создавать закругленные кнопки Canvas , также если вы используете изображение с закругленными углами и установите relief='flat' для кнопки, не будут ли они немного закругленными?

Ответ №1:

Вот как вы можете создавать закругленные «кнопки» в tkinter (то, что определяет видимую форму, — это то, как выглядит изображение):

 from tkinter import Tk, Canvas
from PIL import Image, ImageTk


# use your images here
# open your images (my preference is to use `.open` before initialising `Tk`)
img = Image.open('rounded.png')
# resize to match window geometry
bg = Image.open('space.jpg').resize((500, 400))


# the function to call when button clicked
def func(event=None):
    print('clicked')


root = Tk()
root.geometry('500x400')
# here are the converted images
photo = ImageTk.PhotoImage(img)
bg = ImageTk.PhotoImage(bg)

# from now on this will be the "root" window
canvas = Canvas(root, highlightthickness=0)
canvas.pack(fill='both', expand=True)
# add background
canvas.create_image(0, 0, image=bg, anchor='nw')

# create button and you have to use coordinates (probably can make
# custom grid system or sth)
btn = canvas.create_image(250, 200, image=photo, anchor='c')
# bind the "button" to clicking with left mouse button, similarly
# as `command` argument to `Button`
canvas.tag_bind(btn, '<Button-1>', func)

root.mainloop()
 

Большая часть объяснений содержится в комментариях к коду, но обратите внимание, что связанная последовательность работает для всего изображения, но изображения всегда квадратные, поэтому вы можете нажать кнопку, находящуюся за пределами видимой части, но только до тех пор, пока изображение идет, безусловно, можно создать кнопку, у которой нет таких проблем, но для этого требуется некоторая математика

Важно (предложение):
я настоятельно не рекомендуем использовать подстановочный знак ( * ) при импорте что-то, вы должны либо импортировать то, что вам нужно, например, from module import Class1, func_1, var_2 и так далее, либо импортировать весь модуль: import module вы также можете использовать псевдоним: import module as md или sth, как это, дело в том, что не все импортное, если вы на самом деле знаете, что Вы делаете; наименование столкновения эту проблему.

Комментарии:

1. Похоже, кнопки все еще не закруглены.

2. @HuyVuQuang форма/изображение кнопки должны быть округлены

3. да, так и есть. Они всегда округлые

4. @huyvuquang тогда в чем проблема? Кстати, вы не можете использовать Button для создания кнопок, если хотите, чтобы они были округлены

5. Итак, вы хотите, чтобы я установил картинку для своих кнопок?