2016-07-04 7 views
0

私はこのコードが混乱しているので、私はpythonには新しいですが、修正できないバグを発見しました。このプログラムはあなたに数学的な問題の解を与えることを目的としています。私は1から4までの値としてintを送信したボタンを使っていましたが、次の質問を生成するために推測関数でテストされています。問題は、ボタンが押されたときにintが変更されず、すべての合計がルートに1として設定されているため加算されていることです。誰かがそれが偉大になるのを助けることができたら、事前に感謝!ボタンを押したときに演算整数が変化しないのはなぜですか?

from tkinter import * 
from tkinter import ttk 
from tkinter import messagebox 
from random import randint 

def plus(*args): 
    op = 1 

def minus(*args): 
    op = 2 

def times(*args): 
    op = 3 

def divide(*args): 
    op = 4 

def guess(*args): 
    try: 
     numberguess = int(ans.get()) 
    except ValueError: 
     ask.set('That is not a number!') 

    global number 
    gdif = number - numberguess 

    if gdif == 0: 
     ask.set('You got it right!') 
     global score 
     sco = score.get() + 1 
     score.set(sco) 
     result = messagebox.askquestion('', 'Next question') 
     if result == 'yes': 
      if top.get() == 0: 
       noone = randint(1,10) 
       notwo = randint (1,10) 
      else: 
       noone = randint(1,top.get()) 
       notwo = randint(1,top.get()) 
      ans_entry.focus() 
      if op == 1: 
       number = noone + notwo 
       numb.set('What is ' + str(noone) + ' + '+ str(notwo) + '?') 
      elif op == 2: 
       number = noone - notwo 
       numb.set('What is ' + str(noone) + ' - '+ str(notwo) + '?') 
      elif op == 3: 
       number = noone * notwo 
       numb.set('What is ' + str(noone) + ' x '+ str(notwo) + '?') 
      elif op == 4: 
       number = noone/notwo 
       numb.set('What is ' + str(noone) + '/'+ str(notwo) + '?') 
     elif result == 'no': 
      root.destroy() 
    elif gdif>0: 
     ask.set(ans.get() + ' is too low') 
    elif gdif<0: 
     ask.set(ans.get() + ' is too high') 
    ans.set('') 

root = Tk() 
root.title('Maths Game') #window title 
mainframe = ttk.Frame(root, padding = '3 3 12 12') 
mainframe.grid(column = 0, row = 0, sticky = (N, W, E, S)) 
mainframe.columnconfigure(0,weight = 1) 
mainframe.rowconfigure(0, weight = 1) 
#organises grid well 

ans = StringVar() 
numb = StringVar() 
ask = StringVar() 
pts = StringVar() 
score = IntVar() 
top = IntVar() 
#sets as variables 

ans_entry = ttk.Entry(mainframe, width = 7, textvariable = ans) #defines   guess entry 
ans_entry.grid(column = 2, row = 1, sticky = (W, E)) #places guess entry on grid 
ttk.Label(mainframe, textvariable = numb).grid(column = 2, row = 2, sticky = (W, E)) #label 
ttk.Label(mainframe, textvariable = ask).grid(column = 3, row = 1, sticky = (W, E)) #label 
ttk.Label(mainframe, textvariable = score).grid(column = 3, row = 2, sticky = (E)) #label 
ttk.Label(mainframe, textvariable = pts).grid(column = 4, row = 2, sticky = (W, E)) 
ttk.Button(mainframe, text = 'Answer', command = guess).grid(column = 3, row = 3, sticky = (W, E)) #guess button 
top_entry = ttk.Entry(mainframe, width = 3, textvariable = top) 
top_entry.grid(column = 3, row = 4, sticky = (E)) 
ttk.Button(mainframe, text = '+', command = plus).grid(column = 1, row = 5, sticky = (W, E)) 
ttk.Button(mainframe, text = '-', command = minus).grid(column = 2, row = 5, sticky = (W, E)) 
ttk.Button(mainframe, text = 'x', command = times).grid(column = 3, row = 5, sticky = (W, E)) 
ttk.Button(mainframe, text = '/', command = divide).grid(column = 4, row = 5, sticky = (W, E)) 

for child in mainframe.winfo_children(): child.grid_configure(padx=5, pady=5)      #pads grid nicely 
ans_entry.focus() #cursor starts in box 
root.bind('<Return>', guess) #binds entry key to guess button 

noone = randint(1,10) 
notwo = randint (1,10) 
number = noone + notwo 
numb.set('What is ' + str(noone) + ' + '+ str(notwo) + '?') 
right = False 
sco = 0 
score.set(sco) 
pts.set(' points') 
one = 10 
op = 1 

root.mainloop() #launches main code 
+0

私はあなたのコールバックに 'global op'がありません。 – Holt

+0

ええ、ありがとう! – mchaffs

答えて

1

opはすべての機能のローカル変数です。

def plus(*args): 
    global op 
    op = 1 

. 
. 
. 

をしかし、これはそれを行うのは非常に次善の方法であることに注意してください:

あなたはglobal opを追加する必要があります。 クラスを持っている方がずっと理にかなっており、そのメソッドとしてこれらの関数を持っています。そうすれば、彼らはすべてグローバル変数でなくても変数opにアクセスできます。

+0

おかげさまで、ちょっと自分のためにPythonを学んでいたので、私はそれについて多くのことを本当に知りません。あなたは、メソッドとしての関数を持つクラスを持つことによって何を意味するのか説明できますか? – mchaffs

関連する問題