0

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

我开始构建一个 rpn 计算器。看起来跨平台的关键监听器是 python 的一种圣杯。到目前为止,这似乎可以解决问题,但我还产生了其他问题:

  1. 我无法摆脱条目的全局变量并使用我的堆栈。
  2. 看来我必须从内部构建程序 callback()

这是一个粗略的骨架,显示了我的方向。我是否错过了一种将信息传入和传出的方法callback()

目标是在我发现自己被困在里面之前建立一个 RPN 类callback()

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()
4

1 回答 1

3

你有几个选择去做你想做的事。

1.为您的应用程序使用一个类

在不求助于全局变量的情况下做你想做的事的规范方法是将应用程序放在一个类中,并将方法作为回调传递(参见print_contents),以下内容直接来自文档

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 的函数式编程构造在全局变量上 curry 函数,然后将 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而不是全局内部。

于 2013-03-30T04:50:40.113 回答