Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.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
在pythongui中实现python函数_Python_Tkinter - Fatal编程技术网

在pythongui中实现python函数

在pythongui中实现python函数,python,tkinter,Python,Tkinter,我是PythonGUI新手,以前从未使用过PythonGUI。我只是决定试一试。 这是我将本地日期时间转换为历元的函数,eg.py是这两个函数所在的文件名 def epochConverter(a): return datetime(*a).timestamp() 此函数接受datetime的两个参数,并以时间戳(毫秒)为单位返回 这是意料之中的事 print(DateExtraction((2018,6,8,0,0,0), (2018,6,8,1,0,0))) 现在,我想在pyth

我是PythonGUI新手,以前从未使用过PythonGUI。我只是决定试一试。 这是我将本地日期时间转换为历元的函数,
eg.py
是这两个函数所在的文件名

def epochConverter(a):
    return datetime(*a).timestamp()
此函数接受datetime的两个参数,并以时间戳(毫秒)为单位返回

这是意料之中的事

print(DateExtraction((2018,6,8,0,0,0), (2018,6,8,1,0,0)))
现在,我想在python GUI中实现这一点,我正在使用appjar库。这个简单的GUI代码如下所示

from appJar import gui
from eg import DateExtraction

class MyApplication():
    # Build the GUI
    def Prepare(self, app):
        # Form GUI
        app.setTitle("Simple Application")
        app.setFont(16)
        app.setStopFunction(self.BeforeExit)

        app.addLabel('oneTime',"From Time:", 0, 0)
        app.addEntry("fromTime", 0, 1)
        app.addLabel('twoTime',"To Time:", 1, 0)
        app.addEntry("toTime", 1, 1)
        app.addButtons(["Submit"], self.Submit, colspan=2)
        return app


    def Start(self):
        # Creates a UI
        app = gui()
        app = self.Prepare(app)
        self.app = app
        app.go()

    def BeforeExit(self):
        return self.app.yesNoBox("Confirm Exit", "Are you sure you want to exit?")


    def Submit(self, btnName):
        if btnName == "Submit":
            timefrom = self.app.getEntry("fromTime")
            timeto = self.app.getEntry("toTime")

            DateExtraction(timefrom, timeto)

if __name__ == '__main__':
    App = MyApplication()
    App.Start()
当GUI运行时,我会按原样填充两个文本字段

2018,6,8,0,0,0
2018,6,8,1,0,0
它会抛出错误

TypeError: function takes at most 9 arguments (14 given)
我也试过了,以防万一

(2018,6,8,0,0,0)
(2018,6,8,1,0,0)
再次抛出相同的错误

type error, functions takes bla bla arguments (bla bla given)

我是PythonGUI新手,欢迎提出任何建议。此外,关于tkinter实现上述功能的任何建议也会有所帮助

我对appJar一无所知,但是文本输入字段的内容几乎肯定是字符串,而不是数字元组。因此,不要调用
epochConverter((2018,6,8,0,0,0))
,而是调用
epochConverter(((2018,6,8,0,0,0)”)
,这显然是行不通的

具体问题是
*a
。对于一个由6个数字组成的元组,它将变成6个参数;对于14个字符的字符串,它将转换为14个参数

无论如何,您需要编写一些代码来获取输入字符串,并将其解析为正确的格式


实现这一点的一种方法(尽管是一种相当粗糙的方法)是使用,它将任何用作Python源代码文本的字符串转换为等效值:

timefrom = ast.literal_eval(self.app.getEntry("fromTime"))
当然,您可能希望添加一些错误处理:

try:
    timefrom = ast.literal_eval(self.app.getEntry("fromTime"))
except SyntaxError as e:
    # pop up an error box, or whatever seems appropriate
此外,即使
literal\u eval
成功,这只意味着您有一些有效的Python,不一定是6个整数的元组,它也会成功,比如说,一组两个字符串和一个复数


一种更简洁的方法是为您的特定格式编写解析器。这听起来有点吓人,但是你的格式很简单:你必须有6个整数,中间有逗号,对吗?因此:

def parse_input_date(s):
    parts = s.split(',')
    if len(parts) != 6: raise ValueError(f'Wrong number of parts: {len(parts)} instead of 6')
    return [int(part) for part in parts]
所以现在:

timefrom = parse_input_date(self.app.getEntry("fromTime"))
同样,您需要一些错误处理。在这种情况下,一个无效字符串将给您一个
ValueError
,而不是
SyntaxError
,但在其他情况下,它是相同的

当然,即使现在我们可以确定我们有六个数字的列表,您仍然可以从日期解析中得到一个错误,例如,用户可能要求
2018,40,5,0,0,0


您可能还想考虑将转换逻辑移到<代码> EngCurror 或<代码> DATEXPLOR> <代码>,而不是GUI。\\/p>


例如,假设您希望在命令行工具中使用相同的“引擎”代码。该命令行工具将从
sys.argv
,或
input()
,或类似文件中获取其参数,因此它也将最终获得一个与GUI条目格式相同的字符串,对吗?因此,您可能希望它共享相同的字符串到元组转换逻辑。

谢谢,我会尝试并让您知道它是如何运行的:)除非appJar.gui是tkinter或其他东西的薄包装器(可能是这样,我真的不知道),我认为您不希望tkinter标记出现在这里。@abarnert appJar是在tkinter上构建的,但在这种情况下,问题似乎更多地基于Python类型,而gui本身仍然可以删除它(我个人会保留它,只是为了让使用tkinter的人在搜索中看到这个/查找)。
timefrom = parse_input_date(self.app.getEntry("fromTime"))