在 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
在调整整个 window 时调整到 window 的底部。事实上,它并没有这样做:
也就是说,它确实按照我的需要水平调整到主要 window 的两侧,但它不会垂直调整到 底部 window.
这是为什么?毕竟,我确实告诉它是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
未填充根 window.
首先让我们删除所有无用的权重。因为您的 self.frame
仅被放置在 row=0, column=0
上并且您没有其他小部件放置在根部 window 中,因此无需为其他 rows/columns.[=25 提供权重=]
改变这个:
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
.
防止多次导入
我有这个:
#!/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
在调整整个 window 时调整到 window 的底部。事实上,它并没有这样做:
也就是说,它确实按照我的需要水平调整到主要 window 的两侧,但它不会垂直调整到 底部 window.
这是为什么?毕竟,我确实告诉它是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
未填充根 window.
首先让我们删除所有无用的权重。因为您的 self.frame
仅被放置在 row=0, column=0
上并且您没有其他小部件放置在根部 window 中,因此无需为其他 rows/columns.[=25 提供权重=]
改变这个:
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
.