0

すべての入力ボックスの値をテキストファイルに保存し、このテキストファイルからデータを読み戻し、次のセッションの開始時にデフォルトで表示するTkinterGUIを作成しようとしています。次のデータを含むテキストファイルがあるとします。

one
two
three

次のコードを使用します。

#!usr/bin/env python
from Tkinter import *

class Tracker(Tk):
    def __init__(self, var1, var2, var3):
        Tk.__init__(self)

        # Create label
        app_label = Label(self, text="Enter value")
        app_label.pack()

        self.entry1 = StringVar()
        self.entry1.set(var1)
        ent1 = Entry(self,textvariable=self.entry1)
        ent1.pack()
        self.entry2 = StringVar()
        self.entry2.set(var2)
        ent2 = Entry(self,textvariable=self.entry2)
        ent2.pack()
        self.entry3 = StringVar()
        self.entry3.set(var3)
        ent3 = Entry(self,textvariable=self.entry3)
        ent3.pack()

        # Track 'delete window' event
        self.protocol("WM_DELETE_WINDOW", self.handler)

    def handler(self):
        f = open("backup.txt", "w")
        f.write(self.entry1.get()+'\n'+self.entry2.get()+'\n'+self.entry3.get())
        f.close()
        self.destroy()

if __name__ == "__main__":

    t = open("backup.txt")
    var = t.readlines()
    Text1 = var[0]
    Text2 = var[1]
    Text3 = var[2]

    # Initialize GUI
    app = Tracker(Text1, Text2, Text3)  
    app.mainloop()

次のボックスが表示されます。

エントリ

私のコードは、テキストファイルからデータを読み込み、テキストファイルから事前定義された値を含む入力ボックスを表示することになっています。しかし、それはおかしい演技です。データが正しく保存されない

  1. このGUIを機能させて、上に表示された入力ボックスのデータを編集すると、データが保存され(セッションを閉じるときに)、次に実行したときに自動的に表示されるようにします。

  2. これをループで実行して、エントリウィジェットをハードコーディングせずに任意の数のエントリボックスを表示できるようにする方法はありますか?

4

2 に答える 2

0

ループ内でウィジェットを簡単に作成できます。厳密に言えばStringVar、本当に必要な場合を除き、ウィジェットごとに を作成する必要はありません。各ウィジェット オブジェクトのメソッドを使用してウィジェットの値を取得および設定できるからです。

例えば:

import Tkinter as tk

class SampleApp(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        button = tk.Button(text="Save", command=self.save)
        button.pack(side="top")
        self.widgets = []
        for line in ["one","two","three","four"]:
            widget = tk.Entry(self)
            widget.insert(0, line)
            widget.pack(side="top", fill="x")
            self.widgets.append(widget)

    def save(self):
        for widget in self.widgets:
            print widget.get()

if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()
于 2012-02-27T21:56:18.843 に答える