选项卡式GUI一直挂在输入框上

时间:2014-11-26 13:31:49

标签: python-2.7 user-interface tkinter

我有一个用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;以及如何解决它?

有谁知道为什么我的输入框位置/大小没有改变?

1 个答案:

答案 0 :(得分:3)

您已使用f1几何管理器将小部件放在f2pack中:

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,这意味着该行根本不会增长。