Как изменить ширину panedWindow Tkinter в Python? - PullRequest
0 голосов
/ 04 июля 2018

Я использую объект 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()

1 Ответ

0 голосов
/ 04 июля 2018

Вы можете использовать метод sashpos в окне с панорамированием ttk, чтобы получить как относительную позицию пояса (вещь, которая разделяет панели), так и установить его. Если вы передадите ему только индекс sash (первый sash номер 0 (ноль)), он вернет местоположение этого sash. Если вы предоставите дополнительный аргумент, он установит sash в эту позицию.

Например, чтобы получить позицию первого пояса, который вы используете:

position = self.win.sashpos(0)

Если вы прочитали position из ini-файла, вы можете восстановить его следующим образом:

self.win.sashpos(0, position)

В предоставленном вами обновленном коде вы должны позвонить update до установки положения пояса. Я думаю, что происходит, так как окно с панорамированием еще не отображалось, его фактическая ширина равна 1. Когда вы устанавливаете положение пояса, вы устанавливаете его за пределами окна, поэтому tkinter сбрасывает положение в Наименьшее значение меньше ширины окна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...