2017-08-23 1 views
0

So tkinter Ich verwende eine Schaltfläche zu erstellen, die aus einer Liste ein zufälliges Element zeigt. Wenn diese Taste gedrückt wird, wird ein neuer Eintrag aus der Liste angezeigt, indem ein Zufallszahlengenerator so lange wiederholt wird, bis eine andere Nummer als die alte Nummer erstellt wird. Da es sich um Schaltflächen handelt, muss die Erstellung einer neuen Nummer eine Funktion sein, und die Schaltfläche selbst ist eine Funktion.Python: Übergeben Sie eine Variable in einem bereits laufenden Funktion

Ich habe festgestellt, dass die Variable für die aktuelle Zufallszahl nicht ordnungsgemäß aktualisiert wird. Der Wert ändert sich global, aber nicht innerhalb der Funktion, die die Schaltfläche enthält. Wenn diese Schaltfläche die Funktion zum Generieren einer neuen Nummer ausführt, wird sie mit der ersten generierten Zahl und nicht mit der vorherigen verglichen.

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() 

Wenn Sie die Taste drücken, gibt es die Möglichkeit, sie das gleiche Element aus der Liste angezeigt wird, als rnum in die Funktion nicht übergeben wird, zurück, sobald es bereits ausgeführt wird.

Hat jemand eine Lösung für dieses Problem? Danke im Voraus.

+0

Es scheint, dass Ihr Code in Load() nur einmal ausgeführt wird, aber es klingt, als ob Sie es wiederholt ausführen möchten. Ist das genau? –

+0

Daran hatte ich nicht gedacht, danke! Ich habe das Problem jetzt gelöst, indem ich eine neue Funktion für jede neue Zufallszahl ausgeführt habe. – Pickselated

Antwort

1

Es gibt eine Menge von Peinlichkeit in Ihrem Code. Sie sollten die Namenskonventionen beachten. Siehe PEP8

Mit global:

global rnum 

Nach der Analyse Es scheint, dass rnum ist nicht eine globale Variable, oder Sie es nicht als globale Variable verwenden. Wie auch immer, das Schlüsselwort global ist nur in einer Funktion nützlich. Sehen Sie diese Frage Use of “global” keyword in Python

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

Es klingt ein list, aber es ist nicht! In der Tat ist dies eine Zeichenfolge. So können Sie es schreiben:

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

eine Datei zu öffnen, eine with Anweisung verwenden. Siehe Reading and Writing files.

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

Um die Länge einer Liste zu erhalten, verwenden Sie die len() Funktion:

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

ich in Ihrem Programm jede „Hauptschleife“ nicht sehen. Siehe eine example im Dokument.

+0

Ich habe es geschafft, das Problem jetzt zu lösen, indem ich eine neue Funktion erstelle, die für jede neue Zufallszahl läuft. Mein Code ist peinlich, weil er nie richtig Python beigebracht wird, ich bin meistens Autodidakt. Danke für den Link, ich werde in Zukunft den Namenskonventionen folgen. Können Sie den Unterschied zwischen der Verwendung der Anweisung "mit" und dem Öffnen einer Datei erklären? – Pickselated

+0

@Pickselated: Die mit Erklärung erklärt: https://Stackoverflow.com/q/3012488/1513933 –

+0

Brauchen Sie mehr Erklärung? Ich empfehle Ihnen, meine Antwort zu aktualisieren und zu akzeptieren (https://meta.stackexchange.com/a/5235/344471). –

Verwandte Themen