从QMainWindow调用一个具有变量名的Python函数



我正试图找到一种高效、安全的方法,根据用户输入的事务名称调用不同的函数。有100多种不同的交易。100〃;如果";我想找到一种更有效的方法来调用事务。";eval";会这样做,但我读到不应该使用这一点,因为用户可以输入任何事务名称。

from operator import methodcaller
import  sys
from    PyQt5.QtWidgets     import (QMainWindow,QToolBar,QLineEdit,
QLabel, QApplication)
def one():
print ("1")
def two():
print ("2")
def three():
print("3")
class main_menu(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
menuBar = self.menuBar()
self.ToolBar = QToolBar()
self.ToolBar.setMovable(False)
self.addToolBar(self.ToolBar)
self.tcode = QLineEdit(maxLength=5)
self.tcode.returnPressed.connect(self.tcode_action) 
self.ToolBar.addWidget(QLabel("  Transaction : "))
self.ToolBar.addWidget(self.tcode)
def tcode_action(self):
##        if self.tcode.text() == "one":
##                one()
##        if self.tcode.text() == "two":
##                two()
##        if self.tcode.text() == "three":
##                three()
##        eval(self.tcode.text()+"()")        
def main(args):
app                 = QApplication(sys.argv)
mm = main_menu()
mm.show()
sys.exit(app.exec_())
if __name__=="__main__":
main(sys.argv)

全局变量可以通过python中的globals((访问。您可以使用:

def tcode_action(self):
fn = globals().get(self.tcode.text())
if fn:
fn()
else:
print("invalid input")

一个选项可以是使用QComboBox来限制函数集。您也可以使用Enum来枚举有效的函数。

from enum import Enum
from functools import partial

# function definitions
def fcn_1( x ):
print( 'F1' )

def fcn_2( x ):
print( 'F2' )

# valid functions Enum
# Must wrap functions in partial so they are not defined as methods.
# See below post for more details.
class ValidFunctions( Enum ):
Echo = partial( fcn_1 )
Increment = partial( fcn_2 )

# function selection ComboBox
cb = QComboBox()
cb.addItem( 'Echo' )
cb.AddItem( 'Increment' )

# connecting the signal
def call_function():
fcn = ValidFunctions[ cb.currentText() ]
fcn()

cb.currentIndexChanged.connect( call_function )

注意:我尚未调试此代码。

如何定义作为函数的枚举值

我现在就用这个代码来做这件事:

def tcode_action(self):
try:
func = getattr(self,self.tcode.text())
func()
except:
pass

对此有何评论?

相关内容

  • 没有找到相关文章

最新更新