如何在python中更改Tkinter panedWindow的宽度?

时间:2018-07-04 07:59:36

标签: python python-3.x tkinter

我正在使用tk.PanedWindow对象将我的GUI分为两个窗格。我想动态更改窗格宽度。因为我计划保存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()

2 个答案:

答案 0 :(得分:1)

您可以使用ttk平移窗口的sashpos方法来获取窗扇(分隔窗格的东西)的相对位置并进行设置。如果仅传递窗框的索引(第一个窗框的编号为0(零)),则它将返回该窗框的位置。如果您提供其他参数,它将把窗扇设置到该位置。

例如,要获取第一个窗框的位置,请使用:

position = self.win.sashpos(0)

如果您从ini文件中读取了position,则可以像这样还原它:

self.win.sashpos(0, position)

在您提供的更新代码中,应该在设置窗扇位置之前致电update 。我认为正在发生的事情是,由于尚未显示平移的窗口,因此其实际宽度为1。当您设置窗扇的位置时,您将其设置在窗口的边界之外,因此tkinter会将位置重置为小于窗口宽度的最小值。

答案 1 :(得分:1)

也许为时已晚,但对于其他人来说,我仅在稍作延迟后才设法调整了窗格的大小

self.after(50, lambda: self.win.sashpos(0, position))