2016-07-24 3 views
0

マイコード:ボタンをクリックしたときにのみ変数の値を返す方法はありますか?

def file_exists(f_name): 
     select = 0 

     def skip(): 
      nonlocal select 
      select = 1 
      err_msg.destroy() 

     def overwrite(): 
      nonlocal select 
      select = 2 
      err_msg.destroy() 

     def rename(): 
      global select 
      select = 3 
      err_msg.destroy() 

     # Determine whether already existing zip member's name is a file or a folder 

     if f_name[-1] == "/": 
      target = "folder" 
     else: 
      target = "file" 

     # Display a warning message if a file or folder already exists 

     ''' Create a custom message box with three buttons: skip, overwrite and rename. Depending 
      on the users change the value of the variable 'select' and close the child window''' 

     if select != 0: 
      return select 

私はローカル以外を使用して知っているが悪であるが、私は、少なくとも、このプログラムのために、私の手続きのアプローチとの行かなければなりません。

問題は、私がこのボタンを押しても、押したボタンにかかわらず、すぐにselect(初期値は0)を返すということです。ボタンを押すと、それに応じてselectの値が変更されます。

ボタンを押した後にはどうすればいいですか?ご覧のとおり、私の最初の試みは、選択が!= 0である場合にのみ値を返すことでしたが、これは機能しません。

お寄せいただきありがとうございます!

+0

私は正しくこれを理解しましたが、ユーザーがボタンを押してから、更新された 'select'値を返すまで、' file_exists'関数をブロックしたいとしますか? –

+0

ユーザーが3つのボタンのいずれかを押すまで値を返すのをブロックしたいと思います。投稿を編集しましたか?もしそうなら、ありがとう! – Grendel

+2

'file_exists'関数を早く呼び出す特別な理由はありますか?関数が何かが起こるのを待つ必要があるなら、それは基本的にあなたが早すぎるということを意味するのではないでしょうか?ボタンがクリックされるのを待つ代わりに、関数をボタンに接続して、ボタンが押されたときに関数が実行されるようにする必要があります。適切なタイミングで関数を呼び出すよりも、関数を早期に呼び出して何かが起こるのを待つよりもずっと簡単です。基本的に 'Button(callback = do_stuff_with_select)'と似ています。 –

答えて

-1

.update()機能を使用すると、GUIをフリーズすることなくブロックすることができます。基本的には、条件が満たされるまでループ内でroot.update()を呼び出します。例:

def block(): 
    import Tkinter as tk 

    w= tk.Tk() 

    var= tk.IntVar() 
    def c1(): 
     var.set(1) 
    b1= tk.Button(w, text='1', command=c1) 
    b1.grid() 

    def c2(): 
     var.set(2) 
    b2= tk.Button(w, text='2', command=c2) 
    b2.grid() 

    while var.get()==0: 
     w.update() 
    w.destroy() 

    return var.get() 

print(block()) 
+0

こんにちは、あなたの提案は動作するようです!あなたと他のみんなに感謝します! – Grendel

+0

ループ内で 'update'を呼び出すべきではありません。代わりに、変数が値を変更するまでブロックするようにtkinterに問い合わせることができます(例:w.wait_variable(var) ') –

+0

こんにちはブライアン、あなたの提案に感謝します。残念ながら、変更するtkinter変数はありません。 – Grendel

関連する問題