Вкладка ttk.Notebook с Canvas, расширяющаяся до заполнения окна - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть простой графический интерфейс, который имеет три кадра.Одним из таких кадров является рамка для ноутбука, содержащая холст.Проблема в том, что рамка Ноутбука не расширяется, чтобы соответствовать окну.Я пробовал все различные комбинации grid () и pack ().Ничто, кажется, не работает для меня.Итак, я наконец пришел сюда.Я надеюсь, что кто-то здесь может сказать мне, что я делаю неправильно.В комплекте есть урезанная версия моего кода:

    from tkinter import *
import ttk

window = Tk()
window.geometry("640x480")
window.title("Notebook Test")

options_list = ["one", "two", "three"]

def doNothing():
    pass

leftFrame = Frame(window)
tabFrame = Frame(window)
statusFrame = Frame(window)

leftFrame.grid(row=0, column=0, sticky="n")
tabFrame.grid(row=0, column=1, sticky="nw")
statusFrame.grid(row=2, column=0, columnspan=2, sticky="ew")

Xlabel = Label(leftFrame, text="X Function", anchor=N)
Xlabel.pack()
x_var = StringVar(leftFrame)
x_menu = ttk.Combobox(leftFrame, textvariable=x_var)
x_menu["values"] = options_list
x_menu.current(0)
x_menu.pack()

tab_control = ttk.Notebook(tabFrame)
tab1 = ttk.Frame(tab_control)
tab2 = ttk.Frame(tab_control)
tab_control.add(tab1, text="Default One")
tab_control.add(tab2, text="Default Two")
tab_control.grid()

canvas1 = Canvas(tab1, bg="blue")
canvas2 = Canvas(tab2, bg="green")

canvas1.grid()
canvas2.grid()

tab_control.bind("<ButtonPress-1>", doNothing, True)
tab_control.bind("<ButtonPress-2>", doNothing, True)
tab_control.bind("<ButtonPress-3>", doNothing, True)

status = Label(statusFrame, text = "Status:", bd=1, relief=SUNKEN, anchor=W)
status.pack(fill=X, expand=True)

window.grid_rowconfigure(1, weight=1)
window.grid_columnconfigure(1, weight=1)

window.mainloop()

Вот изображение того, что у меня сейчас есть:

Рамка ноутбука, размер которой не изменяется

Как видите, «голубая» часть должна занимать гораздо больше места.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Чтобы исправить вашу проблему, измените значение .grid() на .pack(...), как показано ниже:

from tkinter import *
import tkinter.ttk as ttk

window = Tk()
window.geometry("640x480")
window.title("Notebook Test")

options_list = ["one", "two", "three"]

def doNothing(event): # added event argument
    pass

leftFrame = Frame(window)
tabFrame = Frame(window)
statusFrame = Frame(window)

leftFrame.grid(row=0, column=0, sticky="n")
tabFrame.grid(row=0, column=1, sticky="nsew") # changed "nw" to "nsew"
statusFrame.grid(row=2, column=0, columnspan=2, sticky="ew")

Xlabel = Label(leftFrame, text="X Function", anchor=N)
Xlabel.pack()
x_var = StringVar(leftFrame)
x_menu = ttk.Combobox(leftFrame, textvariable=x_var)
x_menu["values"] = options_list
x_menu.current(0)
x_menu.pack()

tab_control = ttk.Notebook(tabFrame)
tab1 = ttk.Frame(tab_control)
tab2 = ttk.Frame(tab_control)
tab_control.add(tab1, text="Default One")
tab_control.add(tab2, text="Default Two")
tab_control.pack(expand=1, fill='both') # changed from grid() to pack()

canvas1 = Canvas(tab1, bg="blue")
canvas2 = Canvas(tab2, bg="green")

canvas1.pack(fill='both', expand=1) # changed from grid() to pack()
canvas2.pack(fill='both', expand=1) # changed from grid() to pack()

tab_control.bind("<ButtonPress-1>", doNothing, True)
tab_control.bind("<ButtonPress-2>", doNothing, True)
tab_control.bind("<ButtonPress-3>", doNothing, True)

status = Label(statusFrame, text = "Status:", bd=1, relief=SUNKEN, anchor=W)
status.pack(fill=X, expand=True)

window.grid_rowconfigure(0, weight=1)  # changed row 1 to 0
window.grid_columnconfigure(1, weight=1)

window.mainloop()
0 голосов
/ 26 февраля 2019

Просто передайте height и width виджету вашего ноутбука:

tab_control = ttk.Notebook(tabFrame,height=480,width=495)

Чтобы масштабировать ваши вкладки, привяжите событие <Configure> к корневому окну:

def conf(event):
    tab_control.config(height=window.winfo_height(),width=window.winfo_width()-145)

window.bind("<Configure>",conf)
...