1

Я могу получить tkinter для отображения окон или фонового изображения, есть ли у кого-нибудь предложение о том, как получить оба изображения одновременно (я хочу, чтобы объекты переходили на фоновое изображение), мой код ниже:Tkinter canvas не показывает изображение

from tkinter import * 
from tkinter import ttk 


root= Tk() 
# Code to add widgets will go here... 
root.title("MTGO Daily Decklists") 
def test(): 
    print("things") 

# pick a .gif image file you have in the working directory 
# or give full path 
image1 = PhotoImage(file="backgroundimage.gif") 
w = Canvas(root, width=800, height=700,) 
background = PhotoImage(file = "backgroundimage.gif") 
w.create_image(500, 500, image=image1) 
w.pack() 
format_mtg= StringVar() 
format_entry= ttk.Entry(w, width=25, textvariable=format_mtg) 
format_entry_window = w.create_window(10, 10, anchor='n', window=format_entry) 
format_entry.pack() 
date= StringVar() 
date_entry=ttk.Entry(root, width=25, textvariable=date) 
date_entry_window = w.create_window(10, 10, anchor='n', window=date_entry) 
date_entry.pack() 
ttk.Label(w, text="input format here").pack() 
ttk.Button(w, text="fetch", command=test).pack() 
ttk.Label(w, text="input date here").pack() 
sortby= StringVar() 
sortby_entry= ttk.Entry() 
sortby_entry.pack() 
ttk.Label(w, text="input how you want the decklists to be sorted").pack() 
root.mainloop() 
+0

Я не вижу попытки создать изображение холста из фонового изображения. – TigerhawkT3

+0

упс, я изменил w.create_image (500, 500, изображение = image1) к w.create_image (500, 500, изображение = фон) , но она по-прежнему имеет тот же вопрос – dovefromhell

+0

Когда вы изменили его на 'изображение = background', вы добавили строку для создания изображения холста для 'image1', или вы только создаете одно изображение? – TigerhawkT3

ответ

0

Вы размещаете центр изображения на 500x500. Однако после запуска программы ваше окно составляет всего около 300x200. Вероятно, ваше изображение есть, но не видно видимой части экрана.

Несмотря на то, что размер холста установлен на 800x700, вы размещаете виджеты внутри холста. Это приводит к сжатию холста, чтобы соответствовать его содержимому. Удовлетворяя это, вы не используете опции expand или fill при упаковке холста, поэтому конечный результат заключается в том, что внутренняя часть графического интерфейса сокращается до минимального размера.

примечание: если вы используете create_window добавить окно на холсте, вы должны не также называют grid или pack на этом окне. Вам нужно позвонить либо create_window, либо pack, но не оба. Какой бы вы ни называли последним, это тот, который имеет какой-то эффект.

Существует множество решений, выбор которых зависит от вашей конечной цели. Если вы хотите, чтобы холст был вынужден на высоту 800x700 независимо от размера окна или размера его содержимого, вы можете отключить распространение геометрии внутри холста. Например:

w.pack_propagate(False) 

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

w.pack(fill="both", expand=True) 
w.create_image(0, 0, image=image1, anchor="nw") 

Вы также можете прекратить использование холста и поместить фоновое изображение в ярлык. Затем вы можете использовать place, чтобы центрировать ярлык в главном окне. Например:

background_label = Label(root, image=image1) 
background_label.place(relx=.5, rely=.5) 
+0

, который сработал, большое спасибо – dovefromhell