【问题标题】:Tkinter entry field and loopsTkinter 输入字段和循环
【发布时间】:2018-08-22 13:33:10
【问题描述】:

我正在尝试制作一个简单的付款模块,并通过尝试处理一个小项目/脚本来更好地理解 python。这是我的模块之一的代码:

from tkinter import *
root=Tk()
t1=IntVar()
t2=StringVar()
t3=IntVar()
t4=IntVar()
t5=IntVar()
t6=IntVar()

def verify():
     with open('dbase.txt') as x:
         input1 = t1.get()
         code=[input1]
         for n, line in enumerate(x, 1):
              split_line = line.split()
              for i in code:
                   if i in split_line:
                        item=n+1
                        sale_price=n+2
                        purchase_price=n+3
                        u=x.readline(item)
                        w=x.readline(sale_price)
                        v=x.readline(purchase_price)
                        t2.set(u)
                        t3.set(int(w))
                        t4.set(int(v))

def saved():
     change=int(t5.get())-int(t3.get())
     t6.set(change)

l1=Label(root, text='Code').grid(column=0, row=0)
e1=Entry(root, text=t1).grid(column=1, row=0)
b1=Button(root, text='Verify', command=verify).grid(column=1, row=1)
l2=Label(root, text='Item').grid(column=0, row=2)
e2=Entry(root, text=t2).grid(column=1, row=2)
l3=Label(root, text='Sale Price').grid(column=0, row=3)
e3=Entry(root, text=t3).grid(column=1, row=3)
l4=Label(root, text='Purchase Price').grid(column=0, row=4)
e4=Entry(root, text=t4).grid(column=1, row=4)
l5=Label(root, text='Amount Paid').grid(column=0, row=5)
e5=Entry(root, text=t5).grid(column=1, row=5)
b1=Button(root, text='Save', command=saved).grid(column=1, row=6)
l5=Label(root, text='Change').grid(column=0, row=7)
e5=Entry(root, text=t6).grid(column=1, row=7)

这里是读取代码的 .txt 文件:

1001
sugar
20
30

带有 tkinter 的 GUI 有一些输入字段。挑战在于,一旦传递了按钮上的命令,就无法将 IntVar() t2、t3、t4 和 t6 设置为显示金额。代码哪里出错了,有什么更好的处理方法?

【问题讨论】:

  • .readline() 的可选参数是要读取的最大字符数 - 您似乎希望它是行号。
  • 帮助我理解。我的观点是代码行中的 'n': for n, line in enumerate(x, 1): ,行拆分,以及 (n+1, n+2)...) 的行位置都是用于定位 x 中某些行的位置。因此,当我编写 .readline(line_position) 时,它现在不是返回所选 line_position 中的项目或数字列表吗?
  • .readline() 开始的位置始终是上一次读取结束的位置(或者由.seek() 设置)。您可以对参数执行的唯一操作是限制行长度,这可能会导致读取部分行。如果您想按编号访问行,最简单的方法是使用.readlines()(注意“s”)读取整个文件一次,然后索引到返回的列表中。

标签: python-3.x loops search tkinter


【解决方案1】:

正如 Jason Harper 在 cmets 中指出的那样,您可能想用 readlines() 而不是 readline 做一些事情。

也就是说,我注意到您正在使用 textIntVarStringVar 分配给输入字段。这适用于输入字段,因为它们只有 textvariable 选项而不是 text 选项,因此它接受此论点代替 textvariable 但没有其他接受文本的方法适用于这些类型的变量。所以你应该记住这一点。

管理所有内容的一种方法是将所有IntVarStringVar 放入一个列表中。通过这样做,我们可以使用简单的for index, 代码将数据附加到每个变量。

from tkinter import *


root=Tk()

my_vars = [IntVar(), StringVar(), IntVar(), IntVar(), IntVar(), IntVar()]

def verify():
    with open('dbase.txt') as x:
        input1 = x.readlines()
        print(input1)
        for ndex, i in enumerate(input1):
            my_vars[ndex].set(i)

def saved():
    change=int(my_vars[4].get())-int(my_vars[2].get())
    my_vars[5].set(change)

l1=Label(root, text='Code').grid(column=0, row=0)
e1=Entry(root, textvariable=my_vars[0]).grid(column=1, row=0)
b1=Button(root, text='Verify', command=verify).grid(column=1, row=1)
l2=Label(root, text='Item').grid(column=0, row=2)
e2=Entry(root, textvariable=my_vars[1]).grid(column=1, row=2)
l3=Label(root, text='Sale Price').grid(column=0, row=3)
e3=Entry(root, textvariable=my_vars[2]).grid(column=1, row=3)
l4=Label(root, text='Purchase Price').grid(column=0, row=4)
e4=Entry(root, textvariable=my_vars[3]).grid(column=1, row=4)
l5=Label(root, text='Amount Paid').grid(column=0, row=5)
e5=Entry(root, textvariable=my_vars[4]).grid(column=1, row=5)
b1=Button(root, text='Save', command=saved).grid(column=1, row=6)
l5=Label(root, text='Change').grid(column=0, row=7)
e6=Entry(root, textvariable=my_vars[5]).grid(column=1, row=7)

root.mainloop()

之前:

按下验证后:

【讨论】:

  • 这段代码很有帮助。在有 Python 经验的您中,有没有一种方法可以将代码设计为“通过”输入框中的条目,方法是在输入代码后在 .txt 文档中自动搜索“1001”并将其显示在相应的领域?我的意思是,现在,只有在“验证”命令执行后才能显示。不按按钮可以自动显示吗?
  • 当然,您可以在创建所有字段后通过调用该函数来告诉程序进行搜索。所以在主循环上方的底部写verify()
猜你喜欢
  • 2013-09-06
  • 2014-02-27
  • 1970-01-01
  • 2011-10-23
  • 2020-02-23
  • 1970-01-01
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
相关资源
最近更新 更多