在Python Gui中实现python函数

2024-09-30 12:23:49 发布

您现在位置:Python中文网/ 问答频道 /正文

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

def epochConverter(a):
    return datetime(*a).timestamp()

此函数接受datetime的两个参数并以timestamp(毫秒)为单位返回

^{pr2}$

这和预期的一样

print(DateExtraction((2018,6,8,0,0,0), (2018,6,8,1,0,0)))

现在,我想在pythongui中实现这一点,我使用的是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实现上述功能的建议也会很有帮助。在


Tags: 函数fromselfappdatetimereturndefgui
1条回答
网友
1楼 · 发布于 2024-09-30 12:23:49

我对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"))

当然,您可能需要添加一些错误处理:

^{pr2}$

而且,即使literal_eval成功,也只意味着你有一些有效的Python有效,而不一定是6个整数的元组,它也会成功,比如说,一组两个字符串和一个复数。在


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

^{3}$

所以现在:

timefrom = parse_input_date(self.app.getEntry("fromTime"))

同样,你需要一些错误处理。在本例中,一个无效的字符串将给您一个ValueError,而不是SyntaxError,但在其他情况下,它是相同的。在

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


您可能还想考虑将转换逻辑移到epochConverter或{}而不是GUI中。\在

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

相关问题 更多 >

    热门问题