摆脱python3中的全局变量

时间:2013-03-30 04:14:31

标签: python-3.x tkinter global-variables

首先,我使用的是python 3.3& 3.2分别在Windows和Linux上。

我开始构建一个rpn计算器。看起来跨平台的关键监听器是python的一种圣杯。到目前为止,这似乎正在诀窍,但我已经创造了其他问题:

  1. 我无法摆脱条目的全局变量并使用我的 堆。
  2. 看起来我必须从内部构建程序 callback()
  3. 这是一个粗略的骨架,显示了我的方向。我错过了将信息传入和传出callback()

    的方法

    目标是在我发现自己陷入callback()之前建立一个RPN课程。

    import tkinter as tk
    
    entry = ""
    stack = list()
    
    operators = {"+",
                "-",
                "*",
                "/",
                "^",
                "sin",
                "cos",
                "tan"}
    
    def operate(_op):
        if _op == "+":
            print("plus")
    
    def callback(event):
        global entry, stack
        entry = entry + event.char
        if event.keysym == 'Escape': # exit program
            root.destroy()
        elif event.keysym=='Return': # push string onto stack  TODO
            print(entry)
            entry = ""
        elif entry in operators:
            operate(entry)
    
    
    root = tk.Tk()
    root.withdraw()
    root.bind('<Key>', callback)
    root.mainloop()
    

1 个答案:

答案 0 :(得分:2)

您有多种选择可以做您想做的事。

1。为您的应用程序使用类

在不诉诸全局变量的情况下执行所需操作的规范方法是将应用程序放在一个类中,并将一个方法作为回调传递(参见print_contents)以下是直接from the docs

class App(Frame):
  def __init__(self, master=None):
    Frame.__init__(self, master)
    self.pack()

    self.entrythingy = Entry()
    self.entrythingy.pack()

    # here is the application variable
    self.contents = StringVar()
    # set it to some value
    self.contents.set("this is a variable")
    # tell the entry widget to watch this variable
    self.entrythingy["textvariable"] = self.contents

    # and here we get a callback when the user hits return.
    # we will have the program print out the value of the
    # application variable when the user hits return
    self.entrythingy.bind('<Key-Return>',
                          self.print_contents)

  def print_contents(self, event):
    print("hi. contents of entry is now ---->",
          self.contents.get())

2。在你的州上讨论回调

您还可以使用Python的functional programming constructs来修改全局变量上的函数,然后将curried函数作为回调传递。

import functools

global_var = {}

def callback(var, event):
  pass

#...
root.bind('<Key>', functools.partial(callback, global_var))

虽然这可能不是你想要的。

3。使用全局变量

有时,全局变量都可以。

4。重新设计清洁度和可读性

但是,您绝对不必在回调中构建程序。

实际上,我建议您创建一个包含各种有效和无效输入的测试套件,并创建一个Calculator类或函数,它接受RPN命令的字符串输入并返回一个值。这很容易在没有tkinter接口的情况下进行测试,并且会更加健壮。

然后,使用您的回调构建一个字符串,并将其传递给Calculator

如果您想要增量计算(即,您正在构建模拟器),那么只需让您的计算器接受单个令牌而不是整个方程式,但设计仍然相似。然后将所有状态封装在Calculator内,而不是全局封装。