#python #user-interface #tkinter #canvas #frame
#python #пользовательский интерфейс #tkinter #холст #рамка
Вопрос:
Я хочу рамку шириной = 320 в левой части окна с холстом, в котором я должен отображать данные из файла. На этом холсте будет несколько виджетов (данных), поэтому я хочу также использовать полосу прокрутки в этом. Когда я использовал pack(), в окне ничего не отображается — даже рамка с bg =»sky blue» не видна. Пожалуйста, скажите мне, что не так. Я перепробовал все комбинации fill=BOTH, expand= True и т.д. и т.п. Тем не менее, я не могу сделать то, что хочу.
root = Tk()
root.state('zoomed') #zooms the screen to maxm whenever executed
root.geometry('550x650')
root.minsize(550,650)
#Frame inside root
ContactDetails_frame = Frame(root,width=320,bg='sky blue',bd=2, relief=RIDGE)
ContactDetails_frame.pack(side=LEFT,fill=BOTH)
#Canvas inside the frame
canvas = Canvas(ContactDetails_frame,width=320,bg='sky blue',scrollregion=(30,0,1000,1000))
canvas.pack(fill=BOTH,expand=True)
#Vertical scrollbar for canvas
scrollbar = Scrollbar(canvas,orient=VERTICAL)
scrollbar.pack(side=RIGHT,fill=Y,expand=True)
#Attach scrollbar to canvas
canvas.config(yscrollcommand=scrollbar.set)
scrollbar.config(command=canvas.yview)
#Here are the widgets
FirstName = Label(canvas, text="First name: ", font=(12),bg='sky blue',fg='black')
canvas.create_window(10,175, window=FirstName)
MiddleName = Label(canvas, text="Middle name: ",font=(12),bg='sky blue',fg='black')
canvas.create_window(10,195, window=MiddleName)
LastName = Label(canvas, text="Last name: ",font=(12),bg='sky blue',fg='black')
canvas.create_window(10,215, window=LastName)
NickName = Label(canvas, text="Nick name: ",font=(12),bg='sky blue',fg='black')
canvas.create_window(10,235, window=NickName)
Note = Label(canvas, text="Note: ",font=(12),bg='sky blue',fg='black')
canvas.create_window(10,855, window=Note)
root.mainloop()
Комментарии:
1. Попробуйте изменить родительский элемент полосы прокрутки на
ContactDetails_frame
.
Ответ №1:
Когда вы помещаете полосу прокрутки внутрь холста, холст сжимается, чтобы соответствовать полосе прокрутки. Почти никогда нет веской причины помещать полосу прокрутки внутри холста, поскольку она будет охватывать все объекты, находящиеся на краю. В большинстве случаев холст и полоса прокрутки должны иметь общего родителя.
canvas = Canvas(ContactDetails_frame, ...)
scrollbar = Scrollbar(ContactDetails_frame, ...)
scrollbar.pack(side="right",fill=Y)
canvas.pack(side="left", fill=BOTH,expand=True)
Ответ №2:
Попробуйте задать высоту рамки и холста, которые могут вам помочь Обратите внимание, что единицы измерения рамки и холста разные, что означает, что рамка шириной 320 меньше, чем холст шириной 320 из-за разных единиц измерения. Аналогично обстоит дело с высотой
Комментарии:
1. Спасибо. Но это не дало решения моей проблемы. Добавление высоты не помогло.
2. «Обратите внимание, что единицы измерения рамки и холста разные, что означает, что рамка шириной 320 меньше, чем холст шириной 320 из-за разных единиц измерения » , что просто неверно. В обоих случаях
320
представляет количество пикселей.3. Большое вам спасибо, что рассказали мне об этом, в основном, всякий раз, когда я создавал графический интерфейс с помощью tkinter, я всегда обнаруживал, что рамка и виджеты, такие как текст и кнопка, имеют одинаковую ширину и высоту, тогда рамка кажется меньше текстового виджета, поэтому я подумал, что это будет то же самое и для виджета canvas. Но теперь я протестировал его и обнаружил, что холст и рамка одинаковой ширины и высоты имеют одинаковый размер. Еще раз большое вам спасибо за то, что сказали мне это
4. Текст, кнопки и несколько других виджетов обрабатывают ширину как количество символов, но рамка и холст указаны в пикселях.