2016-04-19 86 views
1

私は現在Tkinterを使って既存のPythonプログラムをGUIにしようとしています。このプログラムは、ユーザに2つの選択肢を与え、ユーザはそれを受け入れるか拒否するかを選択しなければならない。 Tkinterを使う前に、オプションが端末に置かれ、raw_inputが待っていました。 (y/n)である。キャンバステキストが新しいデータで更新され、ユーザーのボタンがクリックされるのを待つために、どうすればいいですか?Python/Tkinterは動的にラベルを更新します

私の質問をより具体的にするには:Tkinterメインループが動作している間に別のプログラムコードを実行して、これらの2つを相互に作用させるにはどうすればいいですか?

下記のコード例。私が正しく理解していれば、あなたのupdate_textfiel機能では、いくつかの矛盾した変数名を持っているまず第一に

from Tkinter import * 

root = Tk() 
root.resizable(width=False, height=False) 
root.geometry('{}x{}'.format(500,550)) 
root.wm_title("Tkinter test") 

BtnFrame = Frame (root) 
BtnFrame.pack(side = BOTTOM) 
BtnFrame.place(y=450, x=20) 

canvas_1 = Canvas(root, width = "200", height ="300") 
canvas_2 = Canvas(root, width = "250", height ="300") 
canvas_1.pack(side = LEFT) 
canvas_2.pack(side = RIGHT) 

textfield_1 = canvas_1.create_text(100,50) 
textfield_2 = canvas_2.create_text(100,50,) 


def update_textfiel_1(text): 
    global textfield_1 
    canvas_1.delete(textfield_1) 
    textfield = canvas.create_text(100,50,text = text) 

def update_textfiel_2(text): 
    global textfield_2 
    canvas_2.delete(textfield_2) 
    textfield1 = canvas1.create_text(100,50,text = text) 



Accept = Button(BtnFrame, text="Accept", width=25) 
Decline = Button(BtnFrame, text="Decline", width=25) 

Accept.pack(side = LEFT) 
Decline.pack(side = RIGHT) 

root.mainloop() 
+0

'Button'コンストラクタの' command'オプションはおそらくあなたが望むものです。そうでなければ[イベント](http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/events.html)と 'Canvas.bind'。 –

+0

更新されたテキストはどのようなものでしょうか? –

+0

更新されたテキストは、元のプログラムのループ関数がTkinterプログラムに渡すものです。私は 'command'と' Canvas.bind'の両方を成功裏に試しました... @ TadhgMcDonald-Jensen – Nate

答えて

0

、あなたは非常にあなたが機能を持っている方法をしたい.itemconfiguredocumentation for methods on canvas widget

def update_textfiel_1(new_text): 
    canvas_1.itemconfigure(textfield_1, text=new_text) 

def update_textfiel_2(new_text): 
    canvas_2.itemconfigure(textfield_2, text=new_text) 

を使用して、それを簡素化することができますそれは単に、いずれかのボタンを押してから、結果を返すために、ユーザのを待ちますこれはtkMessageBoxと非常に簡単です:

question = """Do you accept {}? 
if you say no you will instead get {}""" 
#this message can GREATLY be improved 
# But I really don't understand what you are using it for... 

def user_confirmation(name1, name2): 
    response = tkMessageBox.askyesno("Accept or Decline",question.format(name1,name2)) 
    print(response) 
    if response: # == True 
     return name1 
    else: 
     return name2 

私はまだあなたが現在持っているウィンドウで動作するブロック機能を作る方法を見つけていません...

+0

私はcanvas_1/2が "受け入れられた/拒否されました"というテキストを表示する必要はありません。ユーザーが受け入れ/拒否をクリックしてからユーザーの判断に基づいて続行するのを待つ別のプログラムが必要です。 (return == 'Accept'):return name_1 else:return name_2'ならば、関数 'def user_confirmation(name_1、name_2):answer = raw_input(" Accept/Decline ")を想像してみてください。このプログラムは、どうにかしてcanvas_1/2に表示されるname_1/2を渡します。 – Nate

+0

この回答が役に立たなかった場合は、あなたが何を求めているのか分かりません。['TkMessageBox.askyesno']( http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/tkMessageBox.html)またはこれに類するものを使用して、 'raw_input'を置き換えてください。それ以外の場合は、 'Accepted'と' Declined'ボタンが実際に行うべきことのような、より多くの情報をあなたの質問に追加してください。 –

+0

ああ、あなたのコメントを編集して私の混乱を解消しました。私の答えを編集する時間を与えてください... –

関連する問題