我有一个用Tkinter构建的非常原始的GUI。这是我第一次尝试使用GUI,因此我很难理解发生了什么(以及语法)。这就是我所拥有的:
from __future__ import division, print_function
import os, ttk, tkFileDialog, Tkconstants
import Tkinter as tk
import datetime as dt
Tkinter = tk
# define OS version
version = '0.0.2'
class TestGUI(tk.Tk):
def __init__(self,parent):
tk.Tk.__init__(self,parent)
self.parent = parent
self.initialize()
# try building list of instruments and sites
if os.path.isfile('config'):
with open(''config','r') as config:
config = dict( [(r.split('=')[0].strip(), r.split('=')[1].strip()) for r in config.read().split('\n') if r[0]<>'#'] )
self.datapath = config['datapath']
else:
self.datapath = '../'
def initialize(self):
self.grid()
# set up tabs
self.geometry( "%dx%d+%d+%d" % (1500, 900, 200, 50) )
nb = ttk.Notebook(self)
nb.pack(fill='both',expand='yes')
f1 = tk.Frame(bg='green')
f2 = tk.Frame(bg='blue')
f3 = tk.Frame(bg='red')
f1.grid()
f2.grid()
f3.grid()
nb.add(f1, text='General'.ljust(12,' '))
nb.add(f2, text='Plot'.ljust(12,' '))
nb.add(f3, text='Analysis'.ljust(12,' '))
button = tk.Button(f2,text='I AM A BUTTON!')
button.pack(side='left', anchor='nw', padx=3, pady=5)
# insert button and text box for specifying data location
path_button = tk.Button(f1,text='Browse',command=self.askdirectory).pack(side='left', anchor='nw', padx=10, pady=15)
self.path_entry = tk.StringVar()
self.entry = tk.Entry(f1,textvariable=self.path_entry)
self.entry.grid(column=12,row=8,columnspan=10)
self.entry.bind("<Return>", self.OnPressEnter)
self.path_entry.set(u"Sites directory path...")
def OnButtonClick(self):
print("You clicked the button !")
def OnPressEnter(self,event):
print("You pressed enter !")
def askdirectory(self):
"""Returns a selected directoryname."""
self.datapath = tkFileDialog.askdirectory()
self.path_entry.set(self.datapath)
if __name__ == "__main__":
app = TestGUI(None)
app.title(version)
app.mainloop()
我的问题集中在这里添加一个输入框:
self.path_entry = tk.StringVar()
self.entry = tk.Entry(f1,textvariable=self.path_entry)
self.entry.grid(column=12,row=8,columnspan=10)
self.entry.bind("<Return>", self.OnPressEnter)
self.path_entry.set(u"Sites directory path...")
如果我按原样运行代码,它就会挂起(如果我使用&#34; f2&#34;它也会挂起;我怀疑它在没有实际做任何事情的情况下陷入无限循环中)。但是,如果我从&#34; f1&#34;到&#34; f3&#34;或它的工作原理(输入框现在在第3帧而不是第1帧,但它至少不会挂在我身上)。即使使用f3,还有另一个问题:尽管我更改了列/行/列跨度值,但输入框的宽度/位置永远不会改变。
当我指定&#34; f1&#34;有人知道为什么代码挂起了或&#34; f2&#34;以及如何解决它?
有谁知道为什么我的输入框位置/大小没有改变?
答案 0 :(得分:3)
您已使用f1
几何管理器将小部件放在f2
和pack
中:
button = tk.Button(f2,text='I AM A BUTTON!')
button.pack(side='left', anchor='nw', padx=3, pady=5)
#and
path_button = tk.Button(f1,text='Browse',command=self.askdirectory).pack(side='left', anchor='nw', padx=10, pady=15)
混合几何体管理器会导致您的程序挂起,因此使用grid
放入Entry
就可以了。
来自effbot.org:
警告:切勿在同一主窗口中混合网格和打包。 Tkinter很乐意度过余生,试图协商一个管理人员都满意的解决方案。而不是等待,杀死应用程序,再看看你的代码。一个常见的错误是对某些小部件使用了错误的父级。
您描述的Entry
未更改位置的问题是因为它是唯一的窗口小部件,因此条目所在的行和列是唯一没有的窗口和列宽度和高度为0.要使没有小部件的行和列占用空间,请使用grid_rowconfigure(index, weight=x)
,其中x不为零。 this answer中给出了一个例子。
再次来自effbot.org:
重量 =
用于在行之间分配额外空间的相对权重。权重为2的行将增长到权重为1的行的两倍。默认值为0,这意味着该行根本不会增长。