#python #python-3.x #tkinter #ttk
Вопрос:
Это мой код:
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.protocol("WM_DELETE_WINDOW", lambda: on_closing(root, btn))
frame1 = tk.Frame(root, bg=root['background'])
frame1.pack(expand="YES")
canvas = tk.Canvas(frame1, width=200, height=300, relief="sunken", bd=0, bg=root['background'])
scroll_y = tk.Scrollbar(frame1, orient="vertical", command=canvas.yview, bg=canvas['background'])
scroll_y.pack(side="right", fill='y')
canvas.pack(side="top", expand='YES', fill='both')
canvas.configure(yscrollcommand=scroll_y.set)
# canvas.update_idletasks()
# canvas.yview_moveto('1.0')
s = ttk.Style()
s.configure("new.TFrame", background=canvas['background'], width=canvas.winfo_width(), height=canvas.winfo_height())
msgFrame = ttk.Frame(canvas, style="new.TFrame")
msgFrame.bind("<Configure>", lambda e: canvas.configure(scrollregion=canvas.bbox("all")))
canvas.create_window((0, 0), window=msgFrame, anchor="nw")
Почему рамка не меняет свой цвет? Или его ширина/высота?
Если вы хотите вставить несколько строк в рамку:
for i in range (50):
lbl = tk.Label(msgFrame, text="example").pack()
Комментарии:
1. Воспользуйся
canvas.config(bg=<background colour>)
2. Сначала , когда вы звоните
s.configure(...)
,canvas.winfo_width()
иcanvas.winfo_height()
1 (вы можете использоватьprint()
, чтобы показать их). Во-вторыхwidth
, иheight
их нельзя установить с помощьюs.configure()
, укажите ихttk.Frame(...)
вместо этого. Также для отладки используйте для них разные цвета.3. Ничего из этого не работает…
4.
msgFrame.pack(fill="both", expand="yes")
и используйте другой цвет. я думаю, что вы не определили цвет (поэтому я протестировал его сgreen
помощью, нет никаких проблем)5. @JoeMo обычно
pack/grid/place
не используются для размещения виджета в aCanvas
. Используйтеcreate_window(...)
, как делает ОП.
Ответ №1:
Сначала, используя один и тот же цвет фона для всех виджетов, трудно увидеть эффект. Для целей отладки используйте разные цвета фона для разных виджетов.
Во-вторых , вы не можете установить width
и height
ttk::Frame
использования style.configure()
, укажите их в ttk::Frame(...)
.
Ниже приведен измененный пример, основанный на вашем коде:
import tkinter as tk
from tkinter import ttk
def on_closing(root):
root.destroy()
root = tk.Tk()
root.geometry("400x400")
root.config(bg="cyan")
root.protocol("WM_DELETE_WINDOW", lambda: on_closing(root))
frame1 = tk.Frame(root, bg="red")
frame1.pack(expand="YES")
canvas = tk.Canvas(frame1, width=200, height=300, relief="sunken", bd=0, bg="green")
scroll_y = tk.Scrollbar(frame1, orient="vertical", command=canvas.yview, bg=canvas['background'])
scroll_y.pack(side="right", fill='y')
canvas.pack(side="top", expand='YES', fill='both')
canvas.configure(yscrollcommand=scroll_y.set)
s = ttk.Style()
s.configure("new.TFrame", background="blue")
msgFrame = ttk.Frame(canvas, style="new.TFrame", width=100, height=200) # set width and height
msgFrame.bind("<Configure>", lambda e: canvas.configure(scrollregion=canvas.bbox("all")))
canvas.create_window((0, 0), window=msgFrame, anchor="nw")
root.mainloop()
И результат: