从输入字段tkinter

时间:2018-04-12 11:39:52

标签: python tkinter

所以,我已经看到了关于类似话题的其他问题,我很难理解它们,所以我问这个问题。

我有这个程序,大部分代码都在下面,它是一个基本的GUI。

我在使用用户名和姓的输入字段时出现问题,与此相关的代码块位于:

tk.Label(self, text='First Name: ').pack(side=TOP)
EntryFieldFN = Entry(self)
EntryFieldFN.pack(pady=2, padx=2)

tk.Label(self, text='Surname: ').pack()
EntryFieldSN = Entry(self)
EntryFieldSN.pack(pady=2, padx=2)

FirstName = EntryFieldFN.get()
Surname = EntryFieldSN.get()  

我一直无法弄清楚如何将这些字段中的用户输入存储到我稍后可以使用的变量中。我希望在FinalWindow()函数中使用用户的名字和姓氏,我希望将其作为订单的购买收据。

def FinalWindow():
    win = Toplevel()
    LabelRW = Label(win, text='Receipt of Purchase')
    ExitProg = Button(win, text='Exit', command=sys.exit)
    LabelRW.pack()
    ExitProg.pack()
    win.title('Virtual Receipt')

class Till(tk.Frame):
    def __init__(self, master=None, **kw):
        tk.Frame.__init__(self, master=master, **kw)
        self.price_string = tk.StringVar()
        tk.Label(self, text='GUI Program - Till System').pack(side=TOP)
        tk.Label(self, text='First Name: ').pack(side=TOP)

        EntryFieldFN = Entry(self)
        EntryFieldFN.pack(pady=2, padx=2)

        tk.Label(self, text='Surname: ').pack()
        EntryFieldSN = Entry(self)
        EntryFieldSN.pack(pady=2, padx=2)

        FirstName = EntryFieldFN.get()
        Surname = EntryFieldSN.get()

        tk.Label(self, textvariable=self.price_string).pack(side=BOTTOM)
        tk.Label(self, text="Total Price: ").pack(side=BOTTOM)
        self.items = []

    # For each stock item, create an IntVar, a checkbox and keep record of the price/name

        for idx, item in enumerate(stock_items):
            new_item = {}
            new_item['var'] = tk.IntVar()
            new_item['check'] = tk.Checkbutton(self, text=item['name'], variable=new_item['var'], command=self.recalculate)
            new_item['check'].pack()
            new_item['name'] = item['name']
            new_item['price'] = item['price']
            self.items.append(new_item)

        ExitButton = Button(root, text='Exit', command=sys.exit)
        OrderButton = Button(root, text='Order', command=FinalWindow)
        ExitButton.pack(side=BOTTOM, padx=2, pady=2)
        OrderButton.pack(side=BOTTOM, padx=2, pady=2)
        ExitButton.config(height=1, width=8)
        OrderButton.config(height=1, width=8)

# Recalculate is called when ever a checkbox is checked/unchecked

    def recalculate(self):
        total_price = 0

    # Go through each item and if it is selected add its price to the total

        for item in self.items:
            if item['var'].get():
                total_price += item['price']

    # Display out total price

        self.price_string.set('£ {:.2f}'.format(total_price))

if __name__ == '__main__':
    root = tk.Tk()
    Till(root).pack()
    root.mainloop()

到目前为止,我已经尝试了一些事情,但没有一个有效,我不知道将全局变量用于输入是否是一个好主意。

1 个答案:

答案 0 :(得分:0)

至少有两种方法可以解决这个问题。它们都是通过按钮调用类的一部分方法开始的:

OrderButton = Button(root, text='Order', command=self.do_order)

您还需要确保保留对条目小部件的引用,因此您应使用EntryFieldFNEntryFieldSN而不是self.EntryFieldFNself.EntryFieldSN。这样您就可以从班级的任何位置访问小部件。

def __init__(self, master=None, **kw):
    ...
    self.EntryFieldFN = Entry(self)
    self.EntryFieldSN = Entry(self)
    ...

注意:此概念适用于所有其他输入小部件(例如:Checkbuttons)。我限制了这两个小部件的答案,使代码示例更小,更易于管理。

完成此操作后,您可以执行以下两项操作之一:您的函数可以获取值并将其传递给FinalWindow,或者它可以将自身传递给FinalWindow并让{{1获得它需要的值。

传递单个值

对于第一种情况,您需要定义FinalWindow以将值作为参数:

FinalWindow

接下来,让def FinalWindow(first, last): ... 获取值并调用函数:

do_order

传递类实例

您可以将def do_order(self): first_name = self.EntryFieldFN.get() surname = self.EntryFieldSN.get() window = FinalWindow(first_name, surname) 的实例传递给Till,而不是传递值。

首先,修改FinalWindow以接受单个参数,该参数是FinalWindow的实例。然后,它可以使用此实例来获取所需的数据。

Till

接下来,修改def FinalWindow(till): first_name = till.EntryFieldFN.get() surname = till.EntryFieldSN.get() ... 以简单地将自身传递给函数:

do_order