0

私はあなたが次のコードで私を助けて、どこが間違っているのか教えてくれることを望んでいました. 私はPythonの経験があまりないので、助けていただければ幸いです! 私のコードは次のとおりです。

from Tkinter import *

import math
from math import *

import tkFont
import tkMessageBox

numberOfIngredients = {}
diameter = {}

class Application(Frame):
    """ GUI application that creates a story based on user input. """
    def __init__(self, master):
        """ Initialize Frame. """
        #Make size later master.geometry("485x280+5+10")
        Frame.__init__(self, master)
        self.grid()
        self.create_widgets()
        self.config(bg = "#a6b6cb")

    def create_widgets(self):
        """ Define the widgets and positioning within the frame. """
        #Display the Title
        Label(self, text = "Hamburger Calculator", font = ("Calibri", "25"), bg = "#a6b6cb", fg = "#17375e").grid(row = 0, column = 1, sticky = W)

        #Instructions For Selecting Box
        Label(self, text ="Select your extra ingredients:",
              bg = "#a6b6cb").grid(row = 1, column =1, sticky = W)

        #Button To Calculate
        Button(self, text = "Calculate Cost",  bg = "#92d050",
               command = self.calculate,
               font = ("Calibri", "12")).grid(row = 6, column = 1, sticky = SE)

        #Button To Quit
        Button(self, text = "Quit", bg = "#913c3a",
               command = self.quit,
               font = ("Calibri", "12")).grid(row = 7, column = 1,
                                              sticky = SE)

        #Radio Box For Patty Size
        Label(self, text ="Hamburger Size:",
              bg = "#a6b6cb").grid(row = 1, column = 0, sticky = W)

        diameter = IntVar()

        Radiobutton(self,
                    text = "10 cm",
                    bg = "#a6b6cb",
                    variable = diameter,
                    value = 10,
                    ).grid(row = 3, column = 0, sticky =W)

        Radiobutton(self,
                    text = "20 cm",
                    bg = "#a6b6cb",
                    variable = diameter,
                    value = 20,
                    ).grid(row = 4, column = 0, sticky =W)

        Radiobutton(self,
                    text = "35 cm",
                    bg = "#a6b6cb",
                    variable = diameter,
                    value = 35,
                    ).grid(row = 5, column = 0, sticky =W) 


        #Check Box for Cheese
        self.cheese = BooleanVar()
        Checkbutton(self,
                    text="Cheese",
                    bg = "#a6b6cb",
                    variable = self.cheese,
                    onvalue="yes", offvalue="no"
                    ).grid(row =3,
                    column = 1, sticky =W)
        #Check Box for Mushrooms
        self.mushroom = BooleanVar()
        Checkbutton(self,
                    text="Mushrooms",
                    bg = "#a6b6cb",
                    variable = self.mushroom,
                    onvalue="yes", offvalue="no"
                    ).grid(row =4,
                    column = 1, sticky =W)
        #Check Box for Onions
        self.onion = BooleanVar()
        Checkbutton(self,
                    text="Onions",
                    bg = "#a6b6cb",
                    variable = self.onion,
                    onvalue="yes", offvalue="no"
                    ).grid(row =5,
                    column = 1, sticky =W)
        #Check Box for Extra Beefburger
        self.beefburger = BooleanVar()
        Checkbutton(self,
                    text="Extra Burger Patty",
                    bg = "#a6b6cb",
                    variable = self.beefburger,
                    onvalue="yes", offvalue="no"
                    ).grid(row =6,
                    column = 1, sticky =W)

        numberOfIngredients = 0

        if self.cheese.get() == "yes":
            numberOfIngredients + 1
        if self.mushroom.get() == "yes":
            numberOfIngredients + 1
        if self.onion.get() == "yes":
            numberOfIngredients + 1
        if self.beefburger.get() == "yes":
            numberOfIngredients + 1


    def calculate(self):
        #Constants and Variables
        fixedCost = 3.75
        baseCost = 1.55
        extraCost = 1.25

        global numberOfIngredients
        global diameter

        #Formulas
        area = (pi * sqrt(int(diameter) / 100) ) / 4
        cost = fixedCost + (baseCost * area) + (numberOfIngredients * extraCost)
        totalCost = 1.5 * cost

        #Message Box
        tkMessageBox.showinfo(
            title="Total Cost",
            message="The total cost of the hamburger is $" + str(diameter))


#Main
root = Tk()
root.title("Hamburger Calculator")
app = Application(root)
root.mainloop()
root.destroy()

現時点で発生するエラーは次のとおりです。

Tkinter コールバック トレースバックの例外 (最新の呼び出しが最後): ファイル "C:\Python27\lib\lib-tk\Tkinter.py"、1410 行、呼び出しで return self.func(*args) ファイル "C:\Users\ Matt Sharp\Desktop\Assessment For Hamburgers v2tester.py"、131 行目、calculate area = (pi * sqrt(int(diameter) / 100) ) / 4 TypeError: int() 引数は文字列または数値でなければなりません。 「口述」

このエラーだけでなく、diameter と numberOfIngredients が機能していないこともわかっています。

4

1 に答える 1

2

これは、状態を保存するためにグローバルを避けるべき理由の本当に良い例です...

モジュールの上部でdiameter、辞書として作成します。

diameter = {}

次に、create_widgets()メソッドで、ウィジェットで使用するローカル変数diameterを作成します (ただし、その参照は保持しません)。

diameter = IntVar() 

しかし、あなたのcalculate()メソッドでは、グローバルdiameter(dictである)を参照し、それをintであるかのように数学式で使用します:

area = (pi * sqrt(int(diameter) / 100) ) / 4

で同様のことを行うこともできますnumberOfIngredients。グローバル dict として作成されますが、ローカル int として使用され、保存されず、数学式で再びグローバルとして参照されます。

# global numberOfIngredients is {}
cost = fixedCost + (baseCost * area) + (numberOfIngredients * extraCost)

グローバルは、現在のスコープに基づいて変数の起源を常に特定できるとは限らないため、アプリケーションを簡単に混乱させる可能性があります。

グローバル dict とローカル int をどのように使用するかはわかりませんが、最終的に変数はインスタンス属性としてクラスで維持する必要があります。

class Application(Frame):
    def __init__(self, master): 
        ...
        self.diameter = IntVar()
        self.numberOfIngredients = 0

    def create_widgets(self):
        ...
        Radiobutton(self,
                    text = "10 cm",
                    bg = "#a6b6cb",
                    variable = self.diameter,
                    value = 10,
                    ).grid(row = 3, column = 0, sticky =W)
        ...
        if self.cheese.get() == "yes":
            self.numberOfIngredients += 1

    def calculate(self):
        ...
        area = (pi * sqrt(int(self.diameter) / 100) ) / 4
        cost = fixedCost + (baseCost * area) + \
                    (self.numberOfIngredients * extraCost)
于 2012-08-01T20:59:41.923 に答える