Я использую объект tk.PanedWindow, чтобы разделить мой графический интерфейс на две панели. Я хочу динамически изменять ширину панели. Потому что я планирую сохранить ширину панели для файла ini
для перезагрузки после повторной загрузки программы.
Пробовал self.side_panel.configure(width=200)
и self.side_panel['width']=200
, но это не дает никакого эффекта. Кажется, команды игнорируются. Нет сообщения об ошибке и ничего не изменилось.
Ниже приведена упрощенная версия моего кода GUI. Обратите внимание на часть # Adjust Geometry
.
import tkinter as tk
import tkinter.filedialog
import tkinter.ttk as ttk
class Window(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
# Define GUI
self.place_gui_elements()
# Adjust Geometry
self.geometry("640x500+500+200")
self.statusbar['text'] = (
"Window: "
+ self.geometry()
)
self.side_panel.configure(width=200)
self.side_panel['width']=200
self.statusbar['text'] += (
" side_panel.width:" +
str(self.side_panel.winfo_width())
)
def place_gui_elements(self):
# Define GUI Elements
self.pw = ttk.PanedWindow(orient = "horizontal")
self.main_panel = tk.Frame(self.pw, borderwidth = 1, relief = "sunken")
self.side_panel = tk.Frame(self.pw, borderwidth = 1, relief = "sunken")
self.map_canvas = tk.Canvas(borderwidth = 0, highlightthickness = 0,
bg="black")
self.tile_canvas = tk.Canvas(borderwidth = 0, highlightthickness = 0)
self.scrollbar = tk.Scrollbar(orient = "vertical", borderwidth = 1)
self.statusbar = tk.Label(self, borderwidth = 1, anchor = 'w',
relief = "sunken")
# Place Already Defined GUI Elements
self.statusbar.pack(side = "bottom", fill="x")
self.pw.pack(fill="both", expand=True)
self.pw.add(self.main_panel, weight=1)
self.map_canvas.pack(in_ = self.main_panel, side = "left",
fill = "both", expand = True)
self.pw.add(self.side_panel, weight=0)
self.tile_canvas.grid(in_ = self.side_panel, row = 1, column=0,
sticky="nsew")
self.scrollbar.grid(in_ = self.side_panel, row = 1, column=1,
sticky="ns")
if __name__ == "__main__":
win = Window()
win.mainloop()
Отредактирован - и еще более упрощен - код после предложения @Bryan Oakley. К сожалению, до сих пор не работает.
import tkinter as tk
import tkinter.filedialog
import tkinter.ttk as ttk
class Window(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
# Define GUI Elements
self.pw = ttk.PanedWindow(orient = "horizontal")
self.main_panel = tk.Frame(self.pw, borderwidth = 1, relief = "sunken")
self.side_panel = tk.Frame(self.pw, borderwidth = 1, relief = "sunken")
# Place Already Defined GUI Elements
self.pw.pack(fill="both", expand=True)
self.pw.add(self.main_panel, weight=1)
self.pw.add(self.side_panel, weight=0)
# Adjust Geometry
self.geometry("640x300+500+200")
self.pw.sashpos(0, 300)
self.update()
print ("sashpos %s" % self.pw.sashpos(0))
if __name__ == "__main__":
win = Window()
win.mainloop()