2017-08-23 36 views
0

私はtkinterを使って、リストからランダムな項目を表示するボタンを作成しています。これを押すと、古いリストと異なる番号が生成されるまで、乱数ジェネレータをループすることによって、リストから新しいアイテムが表示されます。彼らはボタンのように、新しい番号の作成は関数でなければならず、ボタン自体は関数の中にあります。Python:既に実行中の関数に変数を渡す

現在の乱数の変数が適切に更新されていないことがわかりました。値はグローバルに変化しますが、ボタンを含む関数の内部では変化しません。したがって、このボタンが新しい数値を生成する関数を実行すると、前の数値ではなく生成された最初の数値と比較します。

from tkinter import * 
import random 
global rnum 

def Load(): 

    ListPath = (".\\Lists\\test.txt") 
    f = open(ListPath, "r") 
    LineList = f.readlines() 
    rnum = random.randint(0,(LineList.__len__()-1)) 

    load = Tk() 
    word = Button(load, text = LineList[rnum], command = lambda: NewRN(rnum, word, LineList), font = ("Calibri", 30)) 
    word.pack() 



def NewRN(rnum, word, LineList): 
    rnumold = rnum 

    while(rnum == rnumold): 
     rnum = random.randint(0,(LineList.__len__()-1)) 
     word.config(text = LineList[rnum]) 
    return(rnum) 

Load() 

ボタンを押すと、それがすでに実行された後RNUMバック関数に渡されていないとして、それは、リストから同じ項目が表示されます可能性があります。

誰にもこの問題の解決策がありますか?前もって感謝します。

+0

Load()のコードは一度しか実行されませんが、繰り返し実行するように思えます。それは正確ですか? –

+0

私はそんなことを考えなかった、ありがとう!私は今、新しい乱数ごとに新しい関数を実行することで問題を解決しました。 – Pickselated

答えて

1

コードには多大な苦労があります。命名規則を尊重する必要があります。 globalの使用を参照してくださいPEP8

global rnum 

は分析した後、RNUMがグローバル変数ではないように見えるか、グローバル変数としてそれを使用しないでください。とにかく、globalキーワードは、関数内でのみ有効です。それはlistに聞こえるが、それはない、この質問Use of “global” keyword in Python

ListPath = (".\\Lists\\test.txt") 

を参照してください!実際、これは文字列です。 だから、あなたはそれを書くことができます。

ListPath = ".\\Lists\\test.txt" 

withステートメントを使用し、ファイルを開くには。 Reading and Writing filesを参照してください。

with open(ListPath, "r") as f: 
    LineList = f.readlines() 

len()機能を使用、リストの長さを取得するには、次の

rnum = random.randint(0, len(LineList) - 1) 

を私はあなたのプログラム内の任意の「メインループ」を参照してくださいしないでください。ドキュメントのexampleを参照してください。

+0

新しい乱数ごとに実行される新しい関数を作成することで、今問題を解決することができました。私のコードが厄介なことは、Pythonを正しく教えていないためです。私は主に独学です。リンクをありがとう、私は将来の命名規則に従います。あなたは 'with'文とファイルを開くことの違いを説明できますか? – Pickselated

+0

@Pickselated:withステートメントの説明:https://stackoverflow.com/q/3012488/1513933 –

+0

さらに詳しい説明が必要ですか?私はupvoteし、[受け入れる](https://meta.stackexchange.com/a/5235/344471)私の答えをお勧めします。 –

関連する問題