首先,我使用的是python 3.3& 3.2分别在Windows和Linux上。
我开始构建一个rpn计算器。看起来跨平台的关键监听器是python的一种圣杯。到目前为止,这似乎正在诀窍,但我已经创造了其他问题:
callback()
这是一个粗略的骨架,显示了我的方向。我错过了将信息传入和传出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()
答案 0 :(得分:2)
您有多种选择可以做您想做的事。
在不诉诸全局变量的情况下执行所需操作的规范方法是将应用程序放在一个类中,并将一个方法作为回调传递(参见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())
您还可以使用Python的functional programming constructs来修改全局变量上的函数,然后将curried函数作为回调传递。
import functools
global_var = {}
def callback(var, event):
pass
#...
root.bind('<Key>', functools.partial(callback, global_var))
虽然这可能不是你想要的。
有时,全局变量都可以。
但是,您绝对不必在回调中构建程序。
实际上,我建议您创建一个包含各种有效和无效输入的测试套件,并创建一个Calculator
类或函数,它接受RPN命令的字符串输入并返回一个值。这很容易在没有tkinter接口的情况下进行测试,并且会更加健壮。
然后,使用您的回调构建一个字符串,并将其传递给Calculator
。
如果您想要增量计算(即,您正在构建模拟器),那么只需让您的计算器接受单个令牌而不是整个方程式,但设计仍然相似。然后将所有状态封装在Calculator
内,而不是全局封装。