Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中使用大量嵌套语句时改进代码_Python_Python 3.x_Tkinter_Nested - Fatal编程技术网

在python中使用大量嵌套语句时改进代码

在python中使用大量嵌套语句时改进代码,python,python-3.x,tkinter,nested,Python,Python 3.x,Tkinter,Nested,最近,我在上了一些关于Matlab的课程(主要集中于使用数学计算和绘图)之后开始使用Python 3,我仍然是一个非常初学者。 然而,我认为创建一个计算器来计算口袋妖怪的数量会很有趣,你可以使用口袋妖怪中可用的糖果,然后使用Tkinter作为GUI。该程序运行良好,效果良好。然而,我正在努力改进我的编码,这段代码包括许多嵌套的if和while语句,以及其他广泛的变量和参数使用。我想知道如何将这段代码改进为更“pythonic”的代码,或者这是否是创建这样一个程序的正确方法。 先谢谢你 f

最近,我在上了一些关于Matlab的课程(主要集中于使用数学计算和绘图)之后开始使用Python 3,我仍然是一个非常初学者。 然而,我认为创建一个计算器来计算口袋妖怪的数量会很有趣,你可以使用口袋妖怪中可用的糖果,然后使用Tkinter作为GUI。该程序运行良好,效果良好。然而,我正在努力改进我的编码,这段代码包括许多嵌套的if和while语句,以及其他广泛的变量和参数使用。我想知道如何将这段代码改进为更“pythonic”的代码,或者这是否是创建这样一个程序的正确方法。 先谢谢你

    from tkinter import *
    from tkinter import messagebox


    def EvolveCalc():
        title = "Pokemon evolve calculator"
        Poke = var.get()
        Candies_total = Candies.get()
        PAmount = Poke_amount.get()
        if Poke == 'Pokemon':
            messagebox.showinfo(title,
                        "Please select a Pokemon from the dropdown menu")
        elif not PAmount.isdigit():
            messagebox.showinfo(title, "Please only enter numbers")
        elif not Candies_total.isdigit():
            messagebox.showinfo(title, "Please only enter numbers")
        else:
            Candies_total = int(Candies.get())
            PAmount = int(Poke_amount.get())
            Evolve = int((Candies_total - 1) / (Pokedex[Poke] - 1))
            Candies_needed = (PAmount * (Pokedex[Poke] - 1)) + 1
            if PAmount < Evolve:
                n = 0
                while Candies_needed <= Candies_total:
                    n = n + 1
                    PAmount = PAmount + 1
                    Candies_needed = ((PAmount) * (Pokedex[Poke] - 1)) + 1
                    Candies_total = Candies_total + 3
                    Evolve2 = int((Candies_total - 1) / (Pokedex[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(title, String1.format(Evolve, Poke,
                                                          Poke_amount.get(),
                                                          n, Evolve2))
            else:
                m = 0
                while Candies_total <= Candies_needed:
                    m = m + 1
                    PAmount = PAmount - 1
                    Candies_needed = ((PAmount) * (Pokedex[Poke] - 1)) + 1
                    Candies_total = Candies_total + 1
                    Evolve2 = int((Candies_total - 1) / (Pokedex[Poke] - 1))
                String2 = 'Transfer {0} {1} so you can evolve a total of {2} {1}.'
                messagebox.showinfo(title, String2.format(m, Poke, Evolve2))


    root = Tk()

    Pokedex = {'pidgey': 12,
               'caterpie': 12,
               'weedle': 12
               }

    root.title("Pokemon evolve calculator")

    var = StringVar(root)
    var.set('Pokemon')
    choices = Pokedex.keys()
    Pokemon = OptionMenu(root, var, *choices)
    Pokemon.grid(column=0, row=1)

    L1 = Label(root, text='Candies')
    L1.grid(column=1, row=0)

    Candies = Entry(root)
    Candies.grid(column=1, row=1)

    L2 = Label(root, text='Pokemon amount in storage')
    L2.grid(column=2, row=0)

    Poke_amount = Entry(root)
    Poke_amount.grid(column=2, row=1)

    Calculate = Button(root, text='Calculate', command=EvolveCalc)
    Calculate.grid(column=1, row=2)

    root.mainloop()
从tkinter导入*
从tkinter导入消息框
def EvolveCalc():
title=“口袋妖怪进化计算器”
Poke=var.get()
Candies_total=Candies.get()
PAmount=Poke_amount.get()
如果Poke==“口袋妖怪”:
messagebox.showinfo(标题,
“请从下拉菜单中选择一个口袋妖怪”)
如果不是PAmount.isdigit():
messagebox.showinfo(标题“请仅输入数字”)
elif not Candies_total.isdigit():
messagebox.showinfo(标题“请仅输入数字”)
其他:
Candies_total=int(Candies.get())
PAmount=int(Poke_amount.get())
Evolve=int((糖果总量-1)/(Pokedex[Poke]-1))
所需糖果=(PAmount*(Pokedex[Poke]-1))+1
如果PAmount使用小写和下划线分隔的函数,以便
EvolveCalc
将是
evolve\u calc
  • 使用小写和可读变量,使
    Poke
    Candies\u total
    变为
    Poke
    total\u Candies
  • 这段代码可以简化

    elif not PAmount.isdigit():
         messagebox.showinfo(title, "Please only enter numbers")
    elif not Candies_total.isdigit():
        messagebox.showinfo(title, "Please only enter numbers")
    

  • 您的
    Pokedex
    可以格式化,因此更具可读性

    Pokedex = {'pidgey': 12,
               'caterpie': 12,
               'weedle': 12
               }
    

  • 我无法运行您的代码,因为它的格式不正确。第一个
    else
    块完成后,空格将关闭

  • 其他建议:

    • 阅读PEP8
    • 查看代码示例
    • 编写可在函数中封装的小型可重用代码
    • 添加注释来解释你的一些数学知识

    这个问题可能更适合在“感谢您的评论和建议”会议上提出。我调整了代码,所以如果您感兴趣,您应该能够运行它。将else块替换为intstance将意味着将该函数置于主函数之外,并从主函数内部调用它?之前的实验给我带来了麻烦,因为python中的变量不是全局变量,而且由于我不断更新while循环中的变量,所以每次都必须重新定义每个变量,对吗?如果这听起来让人困惑,对不起。
    Pokedex = {'pidgey': 12,
               'caterpie': 12,
               'weedle': 12
               }
    
    Pokedex = {
      'pidgey': 12,
      'caterpie': 12,
      'weedle': 12
    }