Проблемы с использованием pubsub и передачей определений в python

У меня проблема, когда я подписываюсь на сообщение от pubsub в классе childframe. Я не могу понять, как написать правильный код, который будет показывать выборки из мейнфрейма. Я также не могу передать строку определения в классе дочерних фреймов. Я не знаю, как я уточнил свой вопрос, я знаю, что это трудно понять, но я думаю, что в этом коде вы найдете именно то, о чем я просил. Я новичок в питоне, так что плиз не критикуйте

import wx
from wx.lib.pubsub import Publisher as pub
import pyodbc
cnxn = pyodbc.connect("DRIVER={SQL Server Native Client 11.0};SERVER=10.75.79.215;DATABASE=HUB_DATA;UID=sa;PWD=password")
cursor = cnxn.cursor()




class Mainframe(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent)

        self.panel = wx.Panel(self)
        self.quote1 = wx.StaticText(self.panel, label = "id")
        self.test=wx.StaticText(self.panel, label = "")
        self.editquote1 = wx.TextCtrl(self.panel, size = (140, -1))
        self.button = wx.Button(self.panel, label = "search")


    #
        self.windowSizer = wx.BoxSizer()
        self.windowSizer.Add(self.panel, wx.ID_ANY, wx.ALL | wx.EXPAND)

    #
        self.sizer = wx.GridBagSizer(6, 6)
        self.sizer.Add(self.quote1, (0, 0))
        self.sizer.Add(self.editquote1, (0, 1))


        self.sizer.Add(self.button, (3, 1))
        self.sizer.Add(self.test, (4, 1))


    #
        self.border = wx.BoxSizer()
        self.border.Add(self.sizer, 1, wx.ALL | wx.EXPAND, 6)

    #
        self.panel.SetSizerAndFit(self.border)
        self.SetSizerAndFit(self.windowSizer)

    #
        self.button.Bind(wx.EVT_BUTTON, self.Onbutton and self.afterOnbutton)




    def Onbutton(self,e):
        var = self.editquote1.GetValue()
        if len(var)==9:
            self.test.SetLabel('True')

        if len(var)==9:
            cursor.execute("""SELECT COUNT(DPVLDT) as amount
                            FROM [HBGE_Reports].[dbo].[hub_DDJPFile] s
                            where exists (SELECT [ZGDCS]
                            FROM [HUB_DATA].[dbo].[SSCUSTP] d
                            where [ZGIDNO]=?
                            and
                            s.DPACS=d.ZGDCS)""",str(var))
            raw = cursor.fetchone()
            a = raw.amount
            pub.sendMessage("amount", a)


            cursor.execute("""declare @a varchar(20)
                    set @a=?
                    SELECT [DPVLDT]
                          ,[DPCPDT]
                          ,[DPACB]
                          ,[DPACS]
                          ,[DPACX]
                          ,[DPCYCD]     
                          ,[DPDLCD]
                          ,[RCY_AMOUNT]
                          ,[LCY_AMOUNT]
                          ,[DPBLBL]
                          ,[DPNAR1]
                          ,[DPNAR2]
                          ,[DPNAR3]
                          ,[DPNAR4]     
                          FROM [HBGE_Reports].[dbo].[hub_DDJPFile] s
                          where exists (SELECT [ZGDCS]
                          FROM [HUB_DATA].[dbo].[SSCUSTP] d
                          where [ZGIDNO]=@a
                          and
                          s.DPACS=d.ZGDCS)
                          order by [DPVLDT] desc""", str(var))

            rows = cursor.fetchall()

            for i in range(a):
                pub.sendMessage(i, rows[i].DPVLDT)





        else:   
            self.test.SetLabel('False')

    def afterOnbutton(self,e):
        wx.CallAfter(self.Onbutton,e)
        var = self.editquote1.GetValue()
        if len(var)==9:
            self.new = Childframe(None)
            self.new.Show()





class Childframe(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent)

        self.panel=wx.Panel(self)




        self.windowSizer = wx.BoxSizer()
        self.windowSizer.Add(self.panel, wx.ID_ANY, 13, wx.ALL | wx.EXPAND, 13)

        pub.subscribe(self.amount, "amount")

        for n in range(3):
            pub.subscribe(self.row, n)


    def amount(self, amount):
        for n in range(amount.data):
            [].append(wx.StaticText(self.panel, id=n, label='test', pos=(20, 30 * n)))
        N = amount.data
        return N

    #I'm having problem here. I can't get N and I don't know how to SetLabel in the static text above 
    def row(self, row):
        for n in range(N):
            [].SetLabel(str(row.data))




if __name__=='__main__':
        app=wx.App(False)
        frame1=Childframe(None)
        frame=Mainframe(None)
        frame.Show()
        app.MainLoop()

person DitoOgiashvili    schedule 19.09.2013    source источник


Ответы (1)


Проблема заключается в неправильном времени между созданием дочернего кадра и отправкой сообщения. Когда мейнфрейм отправляет сообщение, новый фрейм еще не существует, и поэтому сообщение никем не получено. Попробуйте разделить события, связанные с кнопкой, вместо:

 self.button.Bind(wx.EVT_BUTTON, self.Onbutton and self.afterOnbutton)

пытаться:

self.button.Bind(wx.EVT_BUTTON, self.afterOnbutton)

и измените код в afterOnbutton так, чтобы другая функция Onbutton вызывалась после:

    def afterOnbutton(self):
        wx.CallAfter(self.Onbutton)
        var = self.editquote1.GetValue()
        if len(var)==9:
            self.new = Childframe(None)
            self.new.Show()

    def Onbutton(self):
        var = self.editquote1.GetValue()
        if len(var)==9:
            self.test.SetLabel('True')
         ... same ...
person darmat    schedule 19.09.2013
comment
хорошо, я попробую, но сообщения принимаются. проблема в том, что я не могу поместить второе сообщение в функцию, которая обновляет создание функции первого сообщения. Спасибо за ответ - person DitoOgiashvili; 19.09.2013
comment
Я не уверен, что понимаю. Вы можете продолжать отправлять разные сообщения с одной и той же темой (например, в этом случае количество — это тема), и объекты, подписанные на эту тему, будут продолжать получать новое сообщение. - person darmat; 19.09.2013
comment
Да, объекты получены, и, как вы видите в моем примере, сумма определения создает статические тексты с суммой, которую я ему отправляю. проблема в том, что когда создаются статические тексты, я не могу изменить их метку. - person DitoOgiashvili; 19.09.2013
comment
Вы пытались назначить обработчик StaticText, а затем установить его значение с помощью handler.SetValue(string_value)? - person darmat; 19.09.2013