1

我希望我没有错过任何可以回答我问题的话题。我现在在这里,因为我对以下任务感到非常沮丧和厌倦: - 我有一个带有 Drive.Google 的电子表格,里面有很多数据 - 我想用 wxPython 创建一个应用程序,从这个电子表格中提取数据(以最简单的方式) - 还想从将通过一个漂亮的界面(面板又名窗口)访问此应用程序的用户那里获取多个数据 - 用户引入的多个数据应该能够与提取的数据一起使用从电子表格中出来。例如查看用户引入的数据是否在电子表格中,以及对用户引入的下一个数据进行一些其他操作。

我希望我能够清楚地表达我想做的事情。现在我是 Google API、Python 和 wxPython 的新手,但我有使用 C++、php、html 的经验。我已经花了 2 周时间发现 Drive.Google 并学习 Python 和 wxPython。我确实遵循了所有这些教程,做了笔记,阅读了stackoverflow问题答案,wiki.wxpython.org等的语气。我每天都在学习,现在我可以单独做很多事情,但是要拥有我上面描述的所有功能只是不知道该怎么做。至少请指引我的方向。很多时候我花几个小时做例子却一无所获。我有 Python、wxPython 扩展、GoogleAppEngine Launcher 甚至 pyCharm 演示。请善待。这是我有史以来的第一个问题。

这是我到目前为止结合相关示例所做的混乱:

import wx
import gdata.docs
import gdata.docs.service
import gdata.spreadsheet.service
import re, os

class Form(wx.Panel):

    def __init__(self, *args, **kwargs):
        super(Form, self).__init__(*args, **kwargs)
        self.createControls()
        self.bindEvents()
        self.doLayout()
        self.spreasht()

    def createControls(self):
        self.logger = wx.TextCtrl(self, style=wx.TE_MULTILINE|wx.TE_READONLY)
        self.saveButton = wx.Button(self, label="Elvegzes")
        self.nameLabel = wx.StaticText(self, label="type Name1:")
        self.nameTextCtrl = wx.TextCtrl(self, value="type here")
        self.name2Label = wx.StaticText(self, label="type Name2:")
        self.name2TextCtrl = wx.TextCtrl(self, value="type here") 


    def bindEvents(self):
        for control, event, handler in \
            [(self.saveButton, wx.EVT_BUTTON, self.onSave),
             (self.nameTextCtrl, wx.EVT_TEXT, self.onNameEntered),
             (self.nameTextCtrl, wx.EVT_CHAR, self.onNameChanged)]:
            control.Bind(event, handler)


    def doLayout(self):
             raise NotImplementedError


    def spreadsht(self):
        gd_client = gdata.spreadsheet.service.SpreadsheetsService()
        gd_client.email = 'my email address'
        gd_client.password = 'my password to it'
        gd_client.source = 'payne.org-example-1'
        gd_client.ProgrammaticLogin()
        q = gdata.spreadsheet.service.DocumentQuery()
        q['title'] = 'stationcenter'
        q['title-exact'] = 'true'
        feed = gd_client.GetSpreadsheetsFeed(query=q)
        spreadsheet_id = feed.entry[0].id.text.rsplit('/',1)[1]
        feed = gd_client.GetWorksheetsFeed(spreadsheet_id)
        worksheet_id = feed.entry[0].id.text.rsplit('/',1)[1]

        al1 = raw_input('Name1: ')
        print al1
        al2 = raw_input('Name2: ')
        print al2

        rows = gd_client.GetListFeed(spreadsheet_id, worksheet_id).entry
        for row in rows:
            for key in row.custom:
                if al1 == row.custom[key].text:
                    print '  %s: %s' % (key, row.custom[key].text)


    def onColorchanged(self, event):
        self.__log('User wants color: %s'%self.colors[event.GetInt()])

    def onReferrerEntered(self, event):
        self.__log('User entered referrer: %s'%event.GetString())

    def onSave(self,event):
        self.__log('User clicked on button with id %d'%event.GetId())

    def onNameEntered(self, event):
        self.__log('User entered name: %s'%event.GetString())

    def onNameChanged(self, event):
        self.__log('User typed character: %d'%event.GetKeyCode())
        event.Skip()

    def onInsuranceChanged(self, event):
        self.__log('User wants insurance: %s'%bool(event.Checked()))

    # Helper method(s):

    def __log(self, message):
        ''' Private method to append a string to the logger text
            control. '''
        self.logger.AppendText('%s\n'%message)




class FormWithSizer(Form):
    def doLayout(self):
        ''' Layout the controls by means of sizers. '''
        boxSizer = wx.BoxSizer(orient=wx.HORIZONTAL)
        gridSizer = wx.FlexGridSizer(rows=5, cols=2, vgap=10, hgap=10)

        # Prepare some reusable arguments for calling sizer.Add():
        expandOption = dict(flag=wx.EXPAND)
        noOptions = dict()
        emptySpace = ((0, 0), noOptions)

        # Add the controls to the sizers:
        for control, options in \
                [(self.nameLabel, noOptions),
                 (self.nameTextCtrl, expandOption),
                 (self.allomas2Label, noOptions),
                 (self.allomas2TextCtrl, expandOption),
                  emptySpace,
                 (self.saveButton, dict(flag=wx.ALIGN_CENTER))]:
            gridSizer.Add(control, **options)

        for control, options in \
                [(gridSizer, dict(border=5, flag=wx.ALL)),
                 (self.logger, dict(border=5, flag=wx.ALL|wx.EXPAND,
                    proportion=1))]:
            boxSizer.Add(control, **options)

        self.SetSizerAndFit(boxSizer)


class FrameWithForms(wx.Frame):
    def __init__(self, *args, **kwargs):
        super(FrameWithForms, self).__init__(*args, **kwargs)
        notebook = wx.Notebook(self)
        form2 = FormWithSizer(notebook)
        notebook.AddPage(form2, 'CALTH')
        self.SetClientSize(notebook.GetBestSize())


if __name__ == '__main__':
    app = wx.App(0)
    frame = FrameWithForms(None, title='Relevant title˝')
    frame.Show()
    app.MainLoop()

再次感谢你!!!!!!!!!!!

4

1 回答 1

0

首先,确保您可以仅使用 Python 下载所需的数据。然后用一个按钮创建一个 wxPython GUI。在该按钮的处理程序中,让它调用可以下载所需数据的脚本。

如果这导致您的 GUI 变得无响应,那么您将需要使用线程来进行下载。如果是这种情况,我推荐以下文章:

好的,现在您可以正确下载数据了。现在您添加一个网格小部件或一个 listctrl / 对象列表视图小部件。选择其中之一。我更喜欢对象列表视图,您可以在此处阅读。然后在您的按钮处理程序中,您可以调用下载器脚本或线程,完成后,您可以使用该数据加载小部件。如果您使用的是线程,那么该线程将不得不调用下一步(即小部件加载位)。

现在您应该显示您的数据。剩下的就是让它看起来很漂亮,也许把下载部分放到一个菜单项中。

于 2012-12-03T15:34:21.693 回答