【发布时间】:2017-08-12 00:43:34
【问题描述】:
所以基本上作为一个初学者程序员,我创建了这个程序,它使用 Tkinter 计算 pokemon go 中不同 pokemon/糖果组合的最大可能进化。我在使用所有代码的函数之前创建了这个程序。但是,我认为使用类会很好,经过一些研究,这就是结果。但是,我基本上是通过将 self 添加到不同方法中的一大堆变量来使其工作的。
我的问题是:在这里使用类是否相关。我对类的研究涉及用对象等填充类,但在这里我只创建一个对象以使用该类并运行一堆计算。
此外,我如何知道在调用变量时何时使用 self。例如,我创建静态类变量的印象是我不必将实例 self 放在它前面来使用它,但这不起作用,所以我只是在变量调用前面放了更多 self 。为什么把一堆自我放在一切前面会起作用?自我是不是矫枉过正,我可以用更聪明的方式来做吗?
from tkinter import *
from tkinter import messagebox
class PokeCalculator(Frame):
pokedex = {
'pidgey': 12,
'caterpie': 12,
'weedle': 12,
'rattata': 25
}
choices = pokedex.keys()
screen_title = 'Pokemon evolve calculator'
def __init__(self, master=None):
Frame.__init__(self, master)
self.master = master
self.make_window()
def make_window(self):
self.master.title(self.screen_title)
L1 = Label(self, text='Candies')
L1.grid(column=1, row=0)
L2 = Label(self, text='Pokemon amount in storage')
L2.grid(column=2, row=0)
self.var = StringVar()
self.var.set('Pokemon')
self.Pokemon = OptionMenu(self, self.var, *self.choices)
self.Pokemon.grid(column=0, row=1)
self.Candies = Entry(self)
self.Candies.grid(column=1, row=1)
self.Poke_amount = Entry(self)
self.Poke_amount.grid(column=2, row=1)
Calculate = Button(self, text='Calculate', command=self.get_and_check)
Calculate.grid(column=1, row=2)
def get_and_check(self):
self.get_values()
self.check_input()
def get_values(self):
self.poke = self.var.get()
self.candies_total = self.Candies.get()
self.p_amount = self.Poke_amount.get()
def check_input(self):
string1 = 'Please select a Pokemon from the dropdown menu'
string2 = 'Please only enter numbers'
if self.poke == 'Pokemon':
messagebox.showinfo(self.screen_title, string1)
elif not self.p_amount.isdigit() or not self.candies_total.isdigit():
messagebox.showinfo(self.screen_title, string2)
else:
self.too_few_pokemon()
def too_few_pokemon(self):
candies_total = int(self.candies_total)
p_amount = int(self.p_amount)
evolve = int((candies_total - 1) / (self.pokedex[self.poke] - 1))
candies_needed = (p_amount * (self.pokedex[self.poke] - 1)) + 1
if p_amount <= evolve:
n = 0
while candies_needed <= candies_total:
n = n + 1
p_amount = p_amount + 1
candies_needed = ((p_amount) * (self.pokedex[self.poke] - 1)) + 1
candies_total = candies_total + 3
evolve2 = int((candies_total - 1) / (self.pokedex[self.poke] - 1))
string1 = ''' You have enough candies too evolve {0} {1},
but you only have {2} {1} in storage and thus can only
evolve {2} {1}.
If you catch {3} more {1} you can now evolve {4} {1}.'''
messagebox.showinfo(self.screen_title, string1.format(evolve, self.poke,
self.p_amount,
n, evolve2))
else:
self.too_much_pokemon()
def too_much_pokemon(self):
candies_total = int(self.candies_total)
p_amount = int(self.p_amount)
candies_needed = (p_amount * (self.pokedex[self.poke] - 1)) + 1
m = 0
while candies_total <= candies_needed:
m = m + 1
p_amount = p_amount - 1
candies_needed = ((p_amount) * (self.pokedex[self.poke] - 1)) + 1
candies_total = candies_total + 1
evolve = int((candies_total - 1) / (self.pokedex[self.poke] - 1))
string2 = 'Transfer {0} {1} so you can evolve a total of {2} {1}.'
messagebox.showinfo(self.screen_title, string2.format(m, self.poke, evolve))
root = Tk()
app = PokeCalculator(root)
app.pack()
root.mainloop()
【问题讨论】:
-
你没有有使用
self来访问一个类变量。例如,您可以使用PokeCalculator.screen_title,但类的实例(当您在实例上使用该方法时self将是什么)可以访问类的命名空间,类级变量所在的位置。
标签: python python-3.x class tkinter self