簡體   English   中英

Python tkinter 縮小小部件

[英]Python tkinter downsizing widgets

我查看了所有其他問題和答案,但找不到適合我正在嘗試做的事情。

代碼:

class GameWin:
    def __init__(self, master):
        self.master = master
        self.master.title("Title")

        self.main_frame = Frame(self.master, bd = 10, bg = uni_bg)
        self.main_frame.grid()

        self.left_frame = Frame(self.main_frame, bd = 10, bg = uni_bg)
        self.left_frame.grid(column = 0, row = 0)

        self.right_frame = Frame(self.main_frame, bd = 10, bg = uni_bg)
        self.right_frame.grid(column = 1, row = 0)

        self.right_frame.columnconfigure(0, weight = 1)
        self.right_frame.rowconfigure(0, weight = 1)
        self.right_frame.columnconfigure(1, weight = 1)
        self.right_frame.rowconfigure(1, weight = 1)

        self.web = Text(self.left_frame, font = (uni_font, 12), wrap = WORD, bg = uni_bt_bg, fg = uni_fg)
        self.web.grid(column = 0, row = 0, padx = 5, pady = 5)

        self.output = Text(self.left_frame, font = (uni_font, 12), wrap = WORD, bg = "black", fg = uni_fg)
        self.output.grid(column = 0, row = 1, padx = 5, pady = 5, sticky = "ew")
        self.output.configure(state = "disabled")

        self.input = Entry(self.left_frame, font = (uni_font, 12))
        self.input.grid(column = 0, row = 2, sticky = "ew")
        self.input.bind('<Return>', self.submit)

        self.notepad = Text(self.right_frame, font = (uni_font, 12), wrap = WORD, bg = uni_fg, fg = "black", width = 42)
        self.notepad.grid(column = 0, row = 0, pady = 5, rowspan = 2)

        self.sys_info = Text(self.right_frame, font = (uni_font, 12), wrap = WORD, bg = uni_bg, fg = uni_fg, width = 35, height = 11, bd = 0)
        self.sys_info.tag_configure('center', justify='center')
        self.sys_info.grid(column = 1, row = 0, pady = 5)
        self.sys_info.insert(END, "NAME", "center")
        self.sys_info.configure(state = "disabled")

        self.trace = Text(self.right_frame, font = (uni_font, 12), wrap = WORD, bg = uni_bg, fg = uni_fg, width = 35, height = 11)
        self.trace.grid(column = 1, row = 1, pady = 5)

        self.email = Text(self.right_frame, font = (uni_font, 12), wrap = WORD, bg = uni_bt_bg, fg = uni_fg)
        self.email.grid(column = 0, row = 2, pady = 5, columnspan = 2)
        self.email.configure(state = "disabled")

        self.respond = Entry(self.right_frame, font = (uni_font, 12))
        self.respond.grid(column = 0, row = 3, columnspan = 2, sticky = "ew")
        self.respond.bind('<Return>', self.do_respond)

    def submit(self, event):
        self.output.configure(state = "normal")
        self.output.configure(state = "disabled")
        pass

    def do_respond(self, event):
        pass

當前屏幕圖片: https://i.imgur.com/P2B6E5y.png

我要弄清楚的第一件事是如何不明確 state 右上角的 3 個文本小部件的大小。 因為每個人的屏幕大小不一樣。 如果我沒有明確 state 的大小,它們會擴展並且一切都變得古怪(因為默認文本小部件很大)。 我希望小部件自動縮小以適合列(與大灰色右下角文本小部件的寬度相同)。 這甚至可能嗎?

其次是讓框架和小部件填滿 window 中的所有空間。 無論是全屏(如圖所示)還是較小的 window(並希望它們的大小保持相對)。 window 的邊緣有很多空白空間,我想擺脫它。 我已經嘗試了我能想到的一切,但我無法讓他們填補那個空間。

我嘗試將前 3 個小部件分別放在它們自己的框架中,限制相對於 window 大小的框架大小,並將小部件設置為填充該框架,但它不起作用。 我曾經嘗試過的代碼: https://pastebin.com/3YWK9Xg2

class GameWin:
    def __init__(self, master):
        self.master = master
        self.master.title("Hacker")
        win_width = self.master.winfo_width()
        win_height = self.master.winfo_height()

        self.main_frame = Frame(self.master, bd = 10, bg = uni_bg)
        self.main_frame.grid(sticky = "nsew")

        self.left_frame = Frame(self.main_frame, bd = 10, bg = uni_bg, height = int(win_height), width = int(win_width/2))
        self.left_frame.grid(column = 0, row = 0, rowspan = 3)
        self.left_frame.grid_propagate(False)

        self.note_frame = Frame(self.main_frame, bd = 10, bg = uni_bg, height = int(win_height/2), width = int(win_width/4))
        self.note_frame.grid(column = 1, row = 0, rowspan = 2, sticky = "n")
        self.note_frame.grid_propagate(False)

        self.sys_frame = Frame(self.main_frame, bd = 10, bg = uni_bg, height = int(win_height/4), width = int(win_width/4))
        self.sys_frame.grid(column = 2, row = 0, sticky = "n")
        self.sys_frame.grid_propagate(False)

        self.trace_frame = Frame(self.main_frame, bd = 10, bg = uni_bg, height = int(win_height/4), width = int(win_width/4))
        self.trace_frame.grid(column = 2, row = 1, sticky = "n")
        self.trace_frame.grid_propagate(False)

        self.bottom_right_frame = Frame(self.main_frame, bd = 10, bg = uni_bg, height = int(win_height/2), width = int(win_width/2))
        self.bottom_right_frame.grid(column = 1, row = 2, columnspan = 2)
        self.bottom_right_frame.grid_propagate(False)

        self.web = Text(self.left_frame, font = (uni_font, 12), wrap = WORD, bg = uni_bt_bg, fg = uni_fg)
        self.web.grid(column = 0, row = 0, padx = 5, pady = 5)

        self.output = Text(self.left_frame, font = (uni_font, 12), wrap = WORD, bg = "black", fg = uni_fg)
        self.output.grid(column = 0, row = 1, padx = 5, pady = 5, sticky = "ew")


        self.input = Entry(self.left_frame, font = (uni_font, 12))
        self.input.grid(column = 0, row = 2, sticky = "ew")
        self.input.bind('<Return>', self.submit)

        self.notepad = Text(self.note_frame, font = (uni_font, 12), wrap = WORD, bg = uni_fg, fg = "black")
        self.notepad.pack(fill = BOTH, expand = YES)

        self.sys_info = Text(self.sys_frame, font = (uni_font, 12), wrap = WORD, bg = uni_bg, fg = uni_fg)
        self.sys_info.tag_configure('center', justify='center')
        self.sys_info.grid(sticky = "nsew")
        self.sys_info.insert(END, "NAME", "center")
        self.sys_info.configure(state = "disabled")

        self.trace = Text(self.trace_frame, font = (uni_font, 12), wrap = WORD, bg = uni_bg, fg = uni_fg)
        self.trace.grid(sticky = "nsew")

        self.email = Text(self.bottom_right_frame, font = (uni_font, 12), wrap = WORD, bg = uni_bt_bg, fg = uni_fg)
        self.email.grid(row = 0, pady = 5, columnspan = 2, sticky = "nsew")
        self.email.configure(state = "disabled")

        self.respond = Entry(self.bottom_right_frame, font = (uni_font, 12))
        self.respond.grid(row = 1, columnspan = 2, sticky = "ew")
        self.respond.bind('<Return>', self.do_respond)

    def submit(self, event):
        self.output.configure(state = "normal")
        self.output.configure(state = "disabled")

    def do_respond(self, event):
        pass

和結果圖片: https://i.imgur.com/IVnw65x.png

這是完整的代碼: https://pastebin.com/Gm2ePqFH 我希望它看起來像在第一張圖片中,而不必明確 state 每個文本小部件的大小。 我想讓它相對於 window 保持相同的大小。

如果您希望小部件縮小到列的大小,對我來說最有效的策略是使小部件非常小,然后使用布局管理器( packplacegrid )使它們更大以適應。 如果這確實是您可以接受的最小尺寸,您可以將小部件設置為 1x1,或者您可以將其設置為您認為的絕對最小值(例如,4 行 20 個字符、20 行 10 個字符等)。

因此,首先要使這些小部件盡可能小。

接下來,確保使用sticky屬性,以便小部件增長以填充其分配的空間。 您還需要確保使用self.right_framesticky屬性,以便它也填充其空間。

最后,確保調用rowconfigurecolumnconfigure為任何具有由grid管理的子級的小部件設置正權重。 你不是為self.master做的,你也不是為self.left_frameself.right_frame做的

根據經驗,如果您只在一個框架中放置一個或兩個小部件,並且希望這些小部件填充框架,那么使用pack比使用grid好得多,因為您不必記住給行和列的權重。

例如,您可以使用pack來管理左右框架。 您也可以使用packGameWin放入它的 master 中。

另外,不要試圖一次解決所有的布局問題。 在你的情況下,我會像這樣解決這個問題:

  • 從您的mainframe開始並獲取它,以便它填充包含的 window。 確保手動調整 window 的大小以觀察它的增長和收縮。

  • 接下來,添加左右框架。 確保它們增長和縮小以適應mainframe

  • 接下來,只關注左框架中的小部件。 添加它們,並確保它們縮小並適合。

  • 然后,專注於正確的框架。 添加它們,並確保它們縮小並適合。

最后,提一句忠告。 將您對grid的調用分組在一起。 現在編寫代碼時,您需要修復散布在整個文件中的一大堆行。 通過一些重組,您需要更改的幾乎所有代碼行都將位於一個代碼塊中。

例如,而不是這個:

self.web = Text(...)
self.web.grid(...)
self.output = Text(...)
self.output.grid(...)
self.input = Text(...)
self.input.grid(...)
self.notepad = Text(...)
self.notepad.grid(...)

做這個:

self.web = Text(...)
self.output = Text(...)
self.input = Text(...)
self.notepad = Text(...)

self.web.grid(...)
self.output.grid(...)
self.input.grid(...)
self.notepad.grid(...)

這樣一來,您就可以一目了然地回答“我的小部件是如何定義的?”和“我的小部件是如何布置的”的問題。 以你現在的方式,這些問題很難回答。

暫無
暫無

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

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