簡體   English   中英

在Python Tk應用中調整列表框的大小

[英]Resizing a Listbox in Python Tk app

我有這個:

#!/usr/bin/env python

import Tkinter
import ttk
import datetime

from Tkinter import Tk, Frame, Entry, Button, Listbox, N, S, E, W

class TkPersonalActivityLog(object):

    def __init__(self):
        pass

    def configure_window(self, root):

        root.grid_columnconfigure(0, weight=1)
        root.grid_rowconfigure(0, weight=1)
        root.grid_rowconfigure(1, weight=1)
        root.grid_rowconfigure(2, weight=2)

        self.frame = Frame(root)
        self.frame.grid(sticky=N+E+S+W)
        self.frame.grid_columnconfigure(0, weight=2)
        self.frame.grid_rowconfigure(0, weight=2)
        self.frame.grid_rowconfigure(1, weight=2)
        self.frame.grid_rowconfigure(2, weight=2)

        self.entry = Entry(self.frame, bg='#e3ecfc')
        self.entry.grid(row=0, sticky=E+W)
        self.entry.focus_set()

        self.savebutton = Button(self.frame, text="Save and Minimize", fg="Black", command=self.cb_save_button)
        self.savebutton.grid(row=1)

        self.history = Listbox(self.frame)
        self.history.grid(row=2,sticky=N+S+E+W)

    def cb_save_button(self):
        act = (datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), self.entry.get())
        self.history.insert(0, ' '.join(act))

    def mainloop(self):
        self.root = Tk()
        self.configure_window(self.root)
        self.root.mainloop()


if __name__ == '__main__':
    main = TkPersonalActivityLog()
    main.mainloop()

我希望在調整整個窗口大小時將self.history調整為窗口底部的大小。 實際上,它沒有這樣做:

在此處輸入圖片說明

也就是說,它確實按照我的需要在主窗口的側面水平調整了大小,但並沒有在窗口的底部垂直調整大小。

這是為什么? 畢竟,我確實要說它是sticky=N+S+E+W嗎?

如果僅將Tkinter導入為tk,則可以省去一些麻煩。

嘗試更改此:

from Tkinter import Tk, Frame, Entry, Button, Listbox, N, S, E, W

至:

Import Tkinter as Tk

另外,您不需要導入N, S, E, W因為可以將字符串用於這些方向。 因此, sticky = "nsew"工作原理與sticky = N+S+E+W工作原理一樣。您的主要問題不是列表框沒有填充框架,而是您的self.frame沒有填充根窗口。

首先,讓我們刪除所有無用的砝碼。 由於您的self.frame僅放置在row=0, column=0並且您沒有在根窗口中放置其他小部件,因此無需為其他行/列提供權重。

更改此:

root.grid_columnconfigure(0, weight=1)
root.grid_rowconfigure(0, weight=1)
root.grid_rowconfigure(1, weight=1)
root.grid_rowconfigure(2, weight=2)

至:

root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)

然后讓我們更改框架的權重,以使列表框展開。

更改:

self.frame.grid_columnconfigure(0, weight=2)
self.frame.grid_rowconfigure(0, weight=2)
self.frame.grid_rowconfigure(1, weight=2)
self.frame.grid_rowconfigure(2, weight=2)

至:

self.frame.grid_columnconfigure(0, weight=1)
self.frame.grid_rowconfigure(2, weight=1)

這應該可以解決您調整大小的問題。

結果:

在此處輸入圖片說明

另一方面,您從tkinter導入方法不止一次。 應該避免這種情況,並且不需要這樣做。 這是您的代碼的修改后的版本,我認為它更干凈一些,並且只需較少的行即可完成同一任務。

#!/usr/bin/env python

import Tkinter as tk
import datetime

class TkPersonalActivityLog(object):

    def __init__(self, root):
        self.master = root
        self.master.rowconfigure(0, weight=1)
        self.master.columnconfigure(0, weight=1)

        self.frame = tk.Frame(self.master)
        self.frame.grid(sticky="nsew")
        self.frame.grid_columnconfigure(0, weight=1)
        self.frame.grid_rowconfigure(2, weight=1)

        self.entry = tk.Entry(self.frame, bg='#e3ecfc')
        self.entry.grid(row=0, sticky="ew")
        self.entry.focus_set()

        self.savebutton = tk.Button(self.frame, text="Save and Minimize", fg="Black", command=self.cb_save_button)
        self.savebutton.grid(row=1)

        self.history = tk.Listbox(self.frame)
        self.history.grid(row=2,sticky="nsew")

    def cb_save_button(self):
        act = (datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), self.entry.get())
        self.history.insert(0, ' '.join(act))


if __name__ == '__main__':
    root = tk.Tk()
    main = TkPersonalActivityLog(root)
    root.mainloop()

此代碼較短,可以通過將import Tkinter as Tk來防止多次import Tkinter as Tk

暫無
暫無

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

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