1

私は Python の初心者で、TkInter を使用して GUI を作成しようとしています。私が抱えている問題は、エントリテキストを表示しようとしているときです。以下は、このタスクのために作成した 2 つの関数です。私のコードに欠けているものはありますか?

これは、エントリ ウィジェットを作成した最初の関数です。

def getArea():

  x1 = StringVar()
  x2 = StringVar()
  y1 = StringVar()
  y2 = StringVar()

  #coor x1
  labelX1 = Label(input, text="X: ").grid(row=1, column=1)
  entryX1 = Entry(input, width=8, textvariable=x1).grid(row=1, column=2)
  #coor x2
  labelY1 = Label(input, text="Y: ").grid(row=2, column=1)
  entryY1 = Entry(input, width=8, textvariable=y1).grid(row=2, column=2)
  #coor y1
  labelX2 = Label(input, text="X: ").grid(row=1, column=3)
  entryX2 = Entry(input, width=8, textvariable=x2).grid(row=1, column=4)
  #coor y2
  labelY2 = Label(input, text="Y: ").grid(row=2, column=3)
  entryY2 = Entry(input, width=8, textvariable=y2).grid(row=2, column=4)

  x1.set("Defalut value x1")
  x2.set("Defalut value x2")
  y1.set("Defalut value y1")
  y2.set("Defalut value y2")

  coorx1 = x1.get()
  coorx2 = x2.get()
  coory1 = y1.get()
  coory2 = y2.get()

  button = Button(input, text='ok',command=lambda:  showResults(coorx1,coorx2,coory1,coory2)).grid(row=1, column=5)

  exitButton = Button(input, text='exit', command=input.destroy).grid(row=2,column=5)

  input.mainloop()

これは、文字列を表示する 2 番目の関数です。

def showResults(x1,x2,y1,y2):
showInfo = Tk()
showInfo.title("Location Temperature")
showInfo.geometry("270x100+470+320")

print x1, x2, y1, y2

info1 = Label(showInfo, text=x1).pack()
info2 = Label(showInfo, text=x2).pack()
info3 = Label(showInfo, text=y1).pack()
info4 = Label(showInfo, text=y2).pack()

buttonClose = Button(showInfo, text='exit', command=showInfo.destroy).pack(side= RIGHT)
showInfo.mainloop()
4

1 に答える 1

3

コードには修正が必要なことがたくさんあります。1 つ目は、 の 2 つのインスタンスを作成していることですTk。Tkinter は、そのクラスのインスタンスを 1 つだけ作成し、そのインスタンスの を 1mainloop回だけ呼び出すように設計されています。2 番目のウィンドウが必要な場合は、 のインスタンスを作成しますToplevel

次に、s を使用する必要はありませんStringVar。インターネット上の多くの例でそれらを使用していることは知っていますが、厳密に言えば、それらは必要ありません。経験則として、それらにトレースを設定する場合、または 2 つのウィジェットで同じ変数を共有する場合にのみ必要です (これは実際には非常に優れた機能です)。代わりにget、テキスト ウィジェットのメソッドを呼び出して値を取得できます。これの主な利点は、作成および管理する必要のあるオブジェクトが少なくなることです。

したがって、あなたができることは次のいずれかです。

  1. 各エントリ ウィジェットへの参照をグローバル変数またはインスタンス変数のいずれかに保存できます (オブジェクト指向スタイルのプログラミングを使用するように切り替えた場合)。
  2. ウィジェットへの参照をshowResults関数に渡すことができます。
  3. sを引き続き使用StringVarして、関数内のエントリ ウィジェットとラベルの両方で同じsshowResultsを共有できます。StringVar繰り返しますが、これらを 2 つの関数が使用できるように保存するか、一方の関数から他方の関数に渡す必要があります。

2 番目の例 (参照を渡し、getメソッドを使用する) については、次のようにします。

button = Button(input, text='ok',command=lambda:  x1=entryX1, y1=entryY1, 
    x2=entryX2, y2=entryY2: showResults(x1,y1,x2,y2)
...
def showResults(x1,y1,x2,y2):
    info1 = Label(showInfo, text=x1.get())
    info2 = Label(showInfo, text=y1.get())

これが唯一の方法ではなく、最良の方法ですらありません。ポイントは、ここにミステリーがないということです。複数の関数で使用される変数と同様に、どこかにグローバル参照を保持するか、参照を渡す必要があります。または、textvariable属性の特別なプロパティを活用します。

于 2012-10-04T02:28:17.613 に答える