Кнопка, занимающая весь кадр даже с заранее заданными шириной и высотой

#tkinter

#tkinter

Вопрос:

несмотря на то, что я уже определил ширину и высоту кнопок, они, похоже, занимают весь кадр самостоятельно. Я не могу понять возможную причину этого.

 import tkinter as tk  root = tk.Tk() root.geometry('400x400') root.columnconfigure(0, weight=1)  root.grid_rowconfigure(0, weight=1)  main_frame = tk.Frame(root, bg="gray") main_frame.grid(sticky='news')  f2 = tk.Frame(main_frame) # create a frame inside the main frame to attach scroll bar to f2.grid(row=1, column=1, padx=5, pady=5, sticky='nw', columnspan=3) # for north, west  f2.grid_rowconfigure(0, weight=1) f2.grid_columnconfigure(0, weight=1)  c2 = tk.Canvas(f2, bg="orange") c2.grid(row=0, column=0, sticky="nsew")  hsb = tk.Scrollbar(f2, orient="horizontal", command=c2.xview, width=10) hsb.grid(row=1, column=0, sticky='we') # west-east c2.configure(xscrollcommand=hsb.set)  f2_c2 = tk.Frame(c2, bg="yellow") c2.create_window((0, 0), window=f2_c2, anchor='nw')  b1 = tk.Button(f2_c2, relief='raised', width=200, height=200) b1.grid(row=0, column=0 ,padx=5, pady=5) b2 = tk.Button(f2_c2, relief='raised', width=200, height=200) b2.grid(row=0, column=1, padx=5, pady=5) b3 = tk.Button(f2_c2, relief='raised', width=200, height=200) b3.grid(row=0, column=2, padx=5, pady=5)  f2_c2.update_idletasks() c2.configure(scrollregion=c2.bbox("all"), width=400, height=400)  root.mainloop()  

введите описание изображения здесь

есть ли обходной путь или мне чего-то не хватает ?

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

1. Обратите внимание, что width это в символах и height в строках для кнопки без изображения. Итак, вы создаете большие кнопки. Измените эти параметры, например, width=10, height=2 чтобы увидеть разницу.

2. Спасибо за разъяснение.. Похоже, сейчас все работает так, как и должно быть. Но все еще не понимаю, почему он покрывал весь кадр, хотя я установил их высоту и ширину почти на половину кадра, в который я их поместил.

3. Еще раз, width и height параметры не указаны в пикселях для кнопки без изображения . Они различаются по количеству символов и количеству строк соответственно. Поэтому для вашего случая вы создали кнопки шириной 200 символов и высотой 200 строк .

4. Да, немного повозившись с ним, я наконец понял, что происходит. Большое вам спасибо за потраченное время.

Ответ №1:

Атрибуты width и height кнопки (и некоторых других) задокументированы в единицах символов среднего размера, если на кнопке нет изображения. Таким образом, если вы установите ширину 200, это будет 200 символов. Если ширина одного символа составляет 16 пикселей, вы устанавливаете ширину кнопки на 3200 пикселей.

Если вы хотите указать ширину в пикселях, вы можете добавить невидимый пиксель к кнопке.

 img = tk.PhotoImage() b1 = tk.Button(f2_c2, relief='raised', width=200, height=200, image=img, compound="c") b2 = tk.Button(f2_c2, relief='raised', width=200, height=200, image=img, compound="c") b3 = tk.Button(f2_c2, relief='raised', width=200, height=200, image=img, compound="c")  

Ответ №2:

 #BUTTON image_1 = tk.PhotoImage() button_1 = tk.Button(f2_c2, relief='raised', width=200, height=200, image=image_1, compound="c")