在Python中,如何获取动态创建的Entry小部件的值

天文达兹

的Python 3.8.0

我正在创建一个简单的GUI,以从文件中读取/写入一组货币值。用户可以通过更新文件来创建新的货币,然后GUI会相应地生成Label and Entry小部件。

然后,用户可以更新货币值,然后程序会将这些值写回到文件中,以备下次使用。

我在项目中有3个文件:main_ar.py-主循环ar_currency_window.py-GUI框架的类currency.py-货币和值列表

该代码在下面列出,并且可以正常运行。将生成该窗口并创建Labels和Entry小部件,并使用相应的值填充输入框。

货币作为字典保存,密钥为3个字母的货币代码。我现在需要做的是将这些值读回到字典中,以便将它们保存到文件中。

我一直在努力寻找一种方法来将Entry文本链接到货币词典,但是以此为基础,我能够提出解决方案。

我现在维护一个单独的字典,该字典使用从0开始的序列作为键(等于Entry小部件的行号),并保留货币代码作为值。然后,我循环遍历,并在原始词典中找到货币,然后可以根据需要比较值。

我确实尝试将原始词典绑定到Entry小部件,但是我无法使它正常工作-它没有产生错误,什么也没做。

因此,我的问题是:是否可以将字典绑定到Entry小部件,还是可以解决这个问题?

main_ar.py

from ar_currency_window import Currency


root = Currency()
root.grid()
root.mainloop()
print("finished")

ar_currency_window.py

import tkinter as tk
from tkinter import ttk

class Currency(tk.Tk):

    def close_window(self):
        self.destroy()

    def save_values(self):
        for entry in self.currencyList:
            findCurrency = self.currencyList[entry]
            oldValue = self.currencies[findCurrency]
            newValue = self.entries[entry].get()

            if oldValue != newValue:
                self.currencies[findCurrency] = newValue

        print(self.currencies)

    def readCurrencies(self):
        myfile = "currency.py"
        with open(myfile) as raw_data:
            for item in raw_data:
                if ':' in item:
                    key, value = item.split(':', 1)
                    self.currencies[key] = value.strip()
                else:
                    pass  # deal with bad lines of text here
        print(self.currencies)

    def writeCurrencies(self):
        myfile = "currency.py"
        with open(myfile, 'w') as f:
            for key, value in self.currencies.items():
                f.write('%s:%s\n' % (key, value))

    def __init__(self):
        super().__init__()

        # The Currencies and Entries strutures
        self.currencies = dict()
        self.currencyList = dict()
        self.entries=[]

        # Set the title and frame properties
        self.title("AR Currency Management")
        self.frame = ttk.Frame(self, padding=(10,10))

        # Gets the requested values of the height and width.
        windowWidth = self.winfo_reqwidth()
        windowHeight = self.winfo_reqheight()

        # Gets both half the screen width/height and window width/height
        positionRight = int(self.winfo_screenwidth() / 2 - windowWidth / 2)
        positionDown = int(self.winfo_screenheight() / 2 - windowHeight / 2)

        # Positions the window in the center of the page.
        self.geometry("+{}+{}".format(positionRight, positionDown))

        # Read in the currencies from the file
        self.readCurrencies()

        # Now create the labels and entry boxes in the frame
        # We use a list to keep track of the entries, so we can reference the entered values later
        r = 0 # row counter
        for k in self.currencies:
            c_label = ttk.Label(self.frame, text=k)
            c_input = ttk.Entry(self.frame, textvariable=self.currencies[k])
            c_input.insert(0,self.currencies[k])

            c_label.grid(column=0, row=r, sticky="W")
            c_input.grid(column=1, row=r, sticky="w")
            self.entries.append(c_input)
            self.currencyList[r]=k
            r += 1

        # Button to save the values
        btnSave = ttk.Button(self.frame, text="Save Currency Values",command=self.save_values)
        btnExit = ttk.Button(self.frame, text="Close",command=self.close_window)
        btnSave.grid(column=0,row=r+1,sticky="W")
        btnExit.grid(column=0, row=r+2, sticky="W")

        self.frame.grid()

currency.py

EUR:1.14
CAD:1.13
POL:2.13
NOK:8.23
USD:0.98
OLK:3.33
PLZ:101.54

非常感谢达伦

天文达兹

好的,所以我通过使用列表并最终弄清楚StringVars解决了我的问题!

因此,以下部分代码已更新:

for k in self.currencies:
    c_label = ttk.Label(self.frame, text=k)
    c_input = ttk.Entry(self.frame, textvariable=self.currencies[k])
    c_input.insert(0,self.currencies[k])

对此:

for k in range(len(self.currencies)):
    c_label = ttk.Label(master, text=self.currencies[k]['Code'], width=5)
    c_label.grid(column=0, row=r, sticky="W")

self.Rates.append( StringVar() )
    self.Rates[k].trace("w", lambda name, index, mode, sv=k:         
        self.validate_rate_data(name, index, mode, self.Rates[sv]))
    t = ttk.Entry(master, width=10,textvariable=self.Rates[k])
    t.insert(0, self.currencies[k]['Rate'])
    t.grid(column=1, row=r, sticky="w", padx=(10, 10))

函数variable_rate_data的定义如下:

def validate_rate_data(self,name, index, mode, var):
    #Scan the Rates and ensure they are numeric
    try:
        f_number = float(var.get())
    except ValueError:
        print("ERROR")

费率列表定义为 self.Rates = []

StringVar跟踪方法被用于调用validate_rate_date方法时的值在窗口小部件而改变。get()然后调用方法以提取值,然后我可以进行验证。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何根据在ttk.entry框中输入的值动态创建ttk小部件?

来自分类Dev

在Tkinter中动态设置Entry小部件值

来自分类Dev

tkinger - 如何在动态创建的网格中获取正确的小部件以进行更新?

来自分类Dev

如何在 PyQT 中定位动态创建的小部件

来自分类Dev

如何重新翻译动态创建的小部件?

来自分类Dev

如何重新翻译动态创建的小部件?

来自分类Dev

在Sitefinity中动态创建窗口小部件

来自分类Dev

在Sitefinity中动态创建窗口小部件

来自分类Dev

从Tkinter中的Entry小部件将参数传递给动态创建的Button

来自分类Dev

如何根据用户输入在 tkinter 中创建动态条目小部件并将这些条目小部件的输入存储在列表中

来自分类Dev

如何获取小部件选择的值?

来自分类Dev

如何在tkinter中存储来自Entry小部件的值以进行循环?

来自分类Dev

如何获取小部件的名称Python Tkinter

来自分类Dev

如何获取字典值的Python列表并在Kivy UI中显示为表格(使用ListView窗口小部件)?

来自分类Dev

如何在Kivy中从一组小部件动态创建纹理?

来自分类Dev

如何在Kivy中从一组小部件动态创建纹理?

来自分类Dev

如何使用 python tkinter 中的复选按钮在 Entry 小部件中显示或隐藏文本?

来自分类Dev

如何在动态窗口小部件中获取QGraphicsView的正确位置,宽度和高度

来自分类Dev

创建父级后如何动态添加小部件

来自分类Dev

在kivy中动态创建的小部件的on_touch_down问题

来自分类Dev

如何在Tkinter中使用循环创建大量的Labels和Entry小部件,并从中获取数据

来自分类Dev

Python:如何获取函数中Entry的值

来自分类Dev

从flutter中的动态生成的小部件获取值,并将Dropdown添加到生成的小部件

来自分类Dev

动态添加小部件python

来自分类Dev

如何验证python中的条目小部件?

来自分类Dev

如何验证python中的条目小部件?

来自分类Dev

Python:如何在标签小部件(tkinter)中动态显示图像

来自分类Dev

Python:如何动态更改散景选择小部件中的选项?

来自分类Dev

访问使用 for 循环创建的 Entry 小部件

Related 相关文章

  1. 1

    如何根据在ttk.entry框中输入的值动态创建ttk小部件?

  2. 2

    在Tkinter中动态设置Entry小部件值

  3. 3

    tkinger - 如何在动态创建的网格中获取正确的小部件以进行更新?

  4. 4

    如何在 PyQT 中定位动态创建的小部件

  5. 5

    如何重新翻译动态创建的小部件?

  6. 6

    如何重新翻译动态创建的小部件?

  7. 7

    在Sitefinity中动态创建窗口小部件

  8. 8

    在Sitefinity中动态创建窗口小部件

  9. 9

    从Tkinter中的Entry小部件将参数传递给动态创建的Button

  10. 10

    如何根据用户输入在 tkinter 中创建动态条目小部件并将这些条目小部件的输入存储在列表中

  11. 11

    如何获取小部件选择的值?

  12. 12

    如何在tkinter中存储来自Entry小部件的值以进行循环?

  13. 13

    如何获取小部件的名称Python Tkinter

  14. 14

    如何获取字典值的Python列表并在Kivy UI中显示为表格(使用ListView窗口小部件)?

  15. 15

    如何在Kivy中从一组小部件动态创建纹理?

  16. 16

    如何在Kivy中从一组小部件动态创建纹理?

  17. 17

    如何使用 python tkinter 中的复选按钮在 Entry 小部件中显示或隐藏文本?

  18. 18

    如何在动态窗口小部件中获取QGraphicsView的正确位置,宽度和高度

  19. 19

    创建父级后如何动态添加小部件

  20. 20

    在kivy中动态创建的小部件的on_touch_down问题

  21. 21

    如何在Tkinter中使用循环创建大量的Labels和Entry小部件,并从中获取数据

  22. 22

    Python:如何获取函数中Entry的值

  23. 23

    从flutter中的动态生成的小部件获取值,并将Dropdown添加到生成的小部件

  24. 24

    动态添加小部件python

  25. 25

    如何验证python中的条目小部件?

  26. 26

    如何验证python中的条目小部件?

  27. 27

    Python:如何在标签小部件(tkinter)中动态显示图像

  28. 28

    Python:如何动态更改散景选择小部件中的选项?

  29. 29

    访问使用 for 循环创建的 Entry 小部件

热门标签

归档