【问题标题】:Creating new entry boxes with button Tkinter使用按钮 Tkinter 创建新的输入框
【发布时间】:2014-09-10 02:27:28
【问题描述】:

当用户决定输入更多输入时,如何使按钮在下方添加两个框(并排)?

def addBox():
    labelframe = Tkinter.Frame()
    labelframe.bind("<Add Input>", callback)
    labelframe.pack()

labelframe = Tkinter.Frame()

labelFrom = Tkinter.Label(labelframe, text= "from")
labelFrom.grid(column=1, row=0)
e = Tkinter.Entry(labelframe)
e.grid(column=1, row=1)

labelTo = Tkinter.Label(labelframe, text= "to")
labelTo.grid(column=2, row=0)
e2 = Tkinter.Entry(labelframe)
e2.grid(column=2, row=1)

labelframe.pack()

addboxButton = Button( root,text='<Add Time Input>', fg="Red",command="addBox")
addboxButton.pack(side=Tkinter.TOP)

【问题讨论】:

  • 你是否正确缩进了你的函数? def addBox() 应该有缩进代码
  • @MahasishShome 已编辑
  • 你不应该缩进整个代码!!!现在,当调用 def addBox() 时,您的所有代码都将运行。 Python 中的缩进与 javascript、PHP 中的大括号 { } 类似。所以基本上只缩进你希望它在函数内部的那部分代码。
  • 您不应该同时使用 pack() 和 grid()。
  • 使用不带引号的函数名command=addBox

标签: python tkinter


【解决方案1】:

这是添加Entry的示例。

您可能会遇到问题,因为您在 command=addBox 中使用了引号

因为您必须从条目中获取值,所以您必须在列表中记住它们。
我添加了从条目中打印文本的按钮。

from Tkinter import *

#------------------------------------

def addBox():
    print "ADD"

    ent = Entry(root)
    ent.pack()

    all_entries.append( ent )

#------------------------------------

def showEntries():

    for number, ent in enumerate(all_entries):
        print number, ent.get()

#------------------------------------

all_entries = []

root = Tk()

showButton = Button(root, text='Show all text', command=showEntries)
showButton.pack()

addboxButton = Button(root, text='<Add Time Input>', fg="Red", command=addBox)
addboxButton.pack()

root.mainloop()

#------------------------------------

编辑:

盒子并排的例子。

我使用grid() 使用新框架将条目并排保存。
这样我就不会在主窗口/框架中将grid() 与pack() 混合在一起。

我使用len(all_entries) 来获取下一个空闲列的数量。

from Tkinter import *

#------------------------------------

def addBox():
    print "ADD"

    # I use len(all_entries) to get nuber of next free column
    next_column = len(all_entries)

    # add label in first row 
    lab = Label(frame_for_boxes, text=str(next_column+1))
    lab.grid(row=0, column=next_column)

    # add entry in second row
    ent = Entry(frame_for_boxes)
    ent.grid(row=1, column=next_column)

    all_entries.append( ent )

#------------------------------------

def showEntries():

    for number, ent in enumerate(all_entries):
        print number, ent.get()

#------------------------------------

all_entries = []

root = Tk()

showButton = Button(root, text='Show all text', command=showEntries)
showButton.pack()

addboxButton = Button(root, text='<Add Time Input>', fg="Red", command=addBox)
addboxButton.pack()

frame_for_boxes = Frame(root)
frame_for_boxes.pack()

root.mainloop()

#------------------------------------


编辑:

另一个例子:

from Tkinter import *

#------------------------------------

def addBox():
    print "ADD"

    frame = Frame(root)
    frame.pack()

    Label(frame, text='From').grid(row=0, column=0)

    ent1 = Entry(frame)
    ent1.grid(row=1, column=0)

    Label(frame, text='To').grid(row=0, column=1)

    ent2 = Entry(frame)
    ent2.grid(row=1, column=1)

    all_entries.append( (ent1, ent2) )

#------------------------------------

def showEntries():

    for number, (ent1, ent2) in enumerate(all_entries):
        print number, ent1.get(), ent2.get()

#------------------------------------

all_entries = []

root = Tk()

showButton = Button(root, text='Show all text', command=showEntries)
showButton.pack()

addboxButton = Button(root, text='<Add Time Input>', fg="Red", command=addBox)
addboxButton.pack()

root.mainloop()

#------------------------------------

【讨论】:

  • 如果我需要两个并排的盒子怎么办(当点击按钮时,它会并排创建两个盒子?我似乎无法做到这一点
  • 如果您需要并排的盒子,请使用grid(column=...)。但不要将pack() 和grid() 混合在一个Frame 中。如果您在一个框架中使用pack(),然后创建第二个框架,将其放在第一个框架内,然后您可以在第二个框架内使用grid()。查看新示例。
  • 谢谢,我似乎无法让滚动条工作,因为用户需要更多输入才能滚动。
  • 据我所知,唯一的方法是使用带有框架的画布来滚动它。查看更多:stackoverflow.com/questions/16188420/…
  • 是的,我今天早些时候确实读过,但我似乎无法正确理解
【解决方案2】:

首先,缩进是一团糟,所以我不知道addBox函数在哪里结束..

其次,我不认为你需要一个按钮,我想一个检查按钮会做同样的事情,它对用户来说也更常见和熟悉,我曾经遇到过这个问题,我只是创建了一个输入框并放在它上面一个标签,表明它是可选的,至于代码,如果它是空的,我只是忽略它,如果我找到任何输入,我会验证输入..
Howerver,这只是一个输入框,你可能需要一些东西更复杂..

看这个..

class OptionsView(Frame):
    """Frame for options in main window"""
    def __init__(self, x, y, parent):
        Frame.__init__(self, parent)
        self.x = x
        self.y = y
        self.placed = False
        self.hidden = False
        self.btn = Button(self, text = 'Button attached to the frame ..', command = lambda: print('Button in frame clicked ..')).pack()
    def pack(self):
        self.place(x = self.x, y = self.y)
        self.placed = True
    def toggle_view(self):
        if self.hidden:
            self.pack()
            self.hidden = False
        else:
            self.place_forget()
            self.hidden = True

if __name__ == '__main__':
    def m_frame():
        if val.get() and not options_frame.placed:
            print('Showing Frame ..')
            options_frame.pack()
        else:
            print('Toggling Frame ..')
            options_frame.toggle_view()

    root = Tk()
    root.geometry('300x400+500+600')
    root.title('Testing Hiding Frames ..')
    options_frame = OptionsView(200, 300, root)

    val = BooleanVar(value = False)
    Checkbutton(text = 'View more Options ..', var = val, command = m_frame).place(x=root.winfo_height()/2, y=root.winfo_width()/2)

    try: root.mainloop()
    except e: showerror('Error!', 'It seems there\'s a problem ..', str(e))

当然你也可以修改主窗口的长度和x轴,如果你想更真实..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 2021-05-25
    • 1970-01-01
    • 2016-04-28
    • 2018-07-24
    相关资源
    最近更新 更多