簡體   English   中英

如何在 python 中更改 Tkinter panedWindow 寬度?

[英]How to change Tkinter panedWindow width in python?

我正在使用 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()

您可以使用sashpos窗格窗口的sashpos方法來獲取窗扇(分隔窗格的東西)的相對位置,並對其進行設置。 如果您只傳遞腰帶的索引(第一個腰帶是數字 0(零)),那么它將返回該腰帶的位置。 如果你提供一個額外的參數,它會將窗扇設置到那個位置。

例如,要獲取第一個腰帶的位置,您將使用:

position = self.win.sashpos(0)

如果您從 ini 文件中讀取position ,您可以像這樣恢復它:

self.win.sashpos(0, position)

在您提供的更新代碼中,您應該設置窗扇位置之前調用update 我認為正在發生的事情是,由於尚未顯示窗格窗口,它的實際寬度為 1。當您設置窗扇的位置時,您將其設置在窗口邊界之外,因此 tkinter 將位置重置為小於窗口寬度的最小值。

也許為時已晚,但對於其他人,我只是在一小段延遲后才設法調整窗格的大小

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM