Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 13, 2020 12:34:09

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Работа с динамической таблицей (ввод массива данных через GUI-интерфейс)

taxol
предложенного AD0DE412 алгоритма
не смешите тут алгоритмом и не пахнет
taxol
вставлять сразу массивом
в смысле копипаста?
taxol
хотя бы натолкните на мысль
ну вот например
 # -*- coding: utf-8 -*- 
###########################################################################
## Python code generated with wxFormBuilder (version Jun 17 2015)
## http://www.wxformbuilder.org/
##
## PLEASE DO "NOT" EDIT THIS FILE!
###########################################################################
import wx
import wx.xrc
import csv
###########################################################################
## Python 2.7
## wx-3.0-msw
###########################################################################
class newTextCntrl(wx.TextCtrl):
    pass
class MyFrame ( wx.Frame ):
    def __init__( self, parent ):
        wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = u"xz", pos = wx.DefaultPosition, size = wx.Size( 355,300 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )
        self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize )
        bSizer1 = wx.BoxSizer( wx.VERTICAL )
        bSizer3 = wx.BoxSizer( wx.HORIZONTAL )
        self.m_spinCtrl1 = wx.SpinCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, wx.SP_ARROW_KEYS, 1, 1000000, 0 )
        bSizer3.Add( self.m_spinCtrl1, 1, wx.ALL, 5 )
        self.m_button1 = wx.Button( self, wx.ID_ANY, u"ok", wx.DefaultPosition, wx.DefaultSize, 0 )
        bSizer3.Add( self.m_button1, 0, wx.ALL, 5 )
        bSizer1.Add( bSizer3, 0, wx.EXPAND, 5 )
        bSizer4 = wx.BoxSizer( wx.VERTICAL )
        self.m_scrolledWindow3 = wx.ScrolledWindow( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.HSCROLL|wx.VSCROLL )
        self.m_scrolledWindow3.SetScrollRate( 5, 5 )
        self.bSizer9 = wx.BoxSizer( wx.VERTICAL )
        self.tbl = []
        self.bSizer9.Add( self.xz(), 1, wx.EXPAND, 5 )
        self.m_scrolledWindow3.SetSizer( self.bSizer9 )
        self.m_scrolledWindow3.Layout()
        self.bSizer9.Fit( self.m_scrolledWindow3 )
        bSizer4.Add( self.m_scrolledWindow3, 1, wx.EXPAND |wx.ALL, 5 )
        bSizer1.Add( bSizer4, 1, wx.EXPAND, 5 )
        bSizer6 = wx.BoxSizer( wx.HORIZONTAL )
        self.m_button5 = wx.Button( self, wx.ID_ANY, u"save", wx.DefaultPosition, wx.DefaultSize, 0 )
        bSizer6.Add( self.m_button5, 1, wx.ALL, 5 )
        bSizer1.Add( bSizer6, 0, wx.EXPAND, 5 )
        self.SetSizer( bSizer1 )
        self.Layout()
        self.Centre( wx.BOTH )
        # Connect Events
        self.Bind( wx.EVT_TEXT_PASTE, self.get_paste )
        self.Bind( wx.EVT_CLOSE, self.close_btn )
        self.m_button1.Bind( wx.EVT_BUTTON, self.btn_ok_evt )
        self.m_button5.Bind( wx.EVT_BUTTON, self.btn_save_evt )
    def __del__( self ):
        pass
    # Virtual event handlers, overide them in your derived class
    def btn_ok_evt( self, event ):
        self.gen(self.m_spinCtrl1.Value)
        event.Skip()
    def close_btn( self, event ):
        exit()
        event.Skip()
    def btn_save_evt( self, event ):
        # пример
        with wx.FileDialog(self, "Save csv file", wildcard="csv files (*.csv)|*.csv",
                           style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) as fileDialog:
            if fileDialog.ShowModal() == wx.ID_CANCEL:
                return     # the user changed their mind
            # save the current contents in the file
            pathname = fileDialog.GetPath()
            try:
                with open(pathname, 'w') as csvfile:
                    writer = csv.writer(csvfile, delimiter=',',
                                            quotechar='|', quoting=csv.QUOTE_MINIMAL)
                    for i in self.tbl:
                        writer.writerow([i[0].GetLineText(0), i[1].GetLineText(0)])
            except IOError:
                wx.LogError("Cannot save current data in file '%s'." % pathname)        
        event.Skip()
    def xz(self):
        bSizer10 = wx.BoxSizer( wx.HORIZONTAL )
        m_textCtrl5 = wx.TextCtrl( 
            self.m_scrolledWindow3, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
        bSizer10.Add( m_textCtrl5, 1, wx.ALL, 5 )
        m_textCtrl6 = wx.TextCtrl( 
            self.m_scrolledWindow3, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
        bSizer10.Add( m_textCtrl6, 1, wx.ALL, 5 )
        self.tbl_indx = [m_textCtrl5, m_textCtrl6]
        self.tbl.append(self.tbl_indx)
        return bSizer10
    def gen(self, need_row):
        self.bSizer9.DeleteWindows()
        self.tbl = []
        for i in range(need_row):
            self.bSizer9.Add(self.xz() , 1, wx.EXPAND, 5 )
            self.m_scrolledWindow3.SetSizer( self.bSizer9 )
            self.m_scrolledWindow3.Layout()
            self.m_scrolledWindow3.FitInside()
    
    def get_paste(self, event):
        # при вставке получаем че в буфере и где произошло
        # ну и еще вставка чего либо в текстовое поле
        # лучше разделить на два три метода пишу для примера
        # зарание извиняюсь за неканон
        text_data = wx.TextDataObject()
        if wx.TheClipboard.Open():
            success = wx.TheClipboard.GetData(text_data)
            wx.TheClipboard.Close()
        if success:
            # че где че куда
            # / 0 - текст в буфере
            # / 1 - об'ект где произошло событие
            # / 2 -об'екты в кхм в нашей как бы таблице
            print ( "-->",
                   "/ 0:",
                   text_data.GetText(),
                   "/ 1:",
                   event.GetEventObject(),
                   "/ 2",
                   self.tbl)
            # нужно распарсить текст из буфера
            # и вставить в нужные элементы таблицы 
            # вставлять это так
            # к примеру вставляем в первую линию и второй столбец "example"
            self.tbl[0][1].SetValue("example")
            # или "example1"
            text_ = self.tbl[0][1]
            print text_
            text_.SetValue("example1")
            return text_data.GetText()
class MyApp(wx.App):
    def OnInit(self):
        wx.InitAllImageHandlers()
        frame_1 = MyFrame(None)
        self.SetTopWindow(frame_1)
        frame_1.Show()
        return 1
if __name__ == "__main__":
    app = MyApp(0)
    app.MainLoop()
doza_and
Это вопрос?
да конечно … ммм спсб (:
зы taxol чет мне кажется что это всё похоже на написане екселя с нескучными обоями … ну такое как ое то
ззы
по донату отписался на почту
да забейте у меня c форума на почту сообщения не идут да и не к чему
вам помогли? ну и вы если возможно помогите кому ни буть там где ни буть когда ни буть … и да если вы так серьезно это все воспринимаете … респект че



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Янв. 13, 2020 13:38:18)

Офлайн

#2 Янв. 15, 2020 13:58:52

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Работа с динамической таблицей (ввод массива данных через GUI-интерфейс)

дополню пжлуй

 # -*- coding: utf-8 -*- 
######################################################################
## Python code generated with wxFormBuilder (version Jun 17 2015)
## http://www.wxformbuilder.org/
##
## PLEASE DO "NOT" EDIT THIS FILE!
######################################################################
import wx
import wx.xrc
import wx.grid
import csv
######################################################################
## Python 2.7
## wx-3.0-msw
######################################################################
class MyFrame1(wx.Frame):
    def __init__(self,parent):
        wx.Frame.__init__ (self, parent, id = wx.ID_ANY,
                     title = "xz", pos = wx.DefaultPosition,
                     size = wx.Size( 500,300 ),
                     style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL)
        self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize)
        bSizer1 = wx.BoxSizer(wx.VERTICAL)
        bSizer2 = wx.BoxSizer(wx.HORIZONTAL)
        self.m_spinCtrl1 = wx.SpinCtrl(self, wx.ID_ANY, u"1",
                                 wx.DefaultPosition, wx.DefaultSize,
                                 wx.SP_ARROW_KEYS, 1, 10**6, 1)
        bSizer2.Add(self.m_spinCtrl1, 1, wx.ALL, 5)
        self.m_button1 = wx.Button( self, wx.ID_ANY, u"ok",
                             wx.DefaultPosition, wx.DefaultSize, 0)
        bSizer2.Add(self.m_button1, 0, wx.ALL, 5)
        bSizer1.Add(bSizer2, 0, wx.EXPAND, 5)
        bSizer3 = wx.BoxSizer( wx.VERTICAL )
        self.m_scrolledWindow1 = wx.ScrolledWindow(self, wx.ID_ANY,
                                             wx.DefaultPosition,
                                             wx.DefaultSize,
                                             wx.HSCROLL|wx.VSCROLL)
        self.m_scrolledWindow1.SetScrollRate(5, 5)
        self.bSizer6 = wx.BoxSizer(wx.VERTICAL)
        #---
        self.make_grid(1)
        #--
        self.bSizer6.Add(self.m_grid2, 1, wx.ALL|wx.EXPAND, 5)
        self.m_scrolledWindow1.SetSizer(self.bSizer6)
        self.m_scrolledWindow1.Layout()
        self.bSizer6.Fit(self.m_scrolledWindow1)
        bSizer3.Add(self.m_scrolledWindow1, 1, wx.ALL|wx.EXPAND, 5)
        bSizer1.Add(bSizer3, 1, wx.EXPAND, 5)
        bSizer5 = wx.BoxSizer(wx.HORIZONTAL)
        #self.m_button3 = wx.Button(self, wx.ID_ANY, u"load",
                             #wx.DefaultPosition, wx.DefaultSize, 0)
        #bSizer5.Add(self.m_button3, 1, wx.ALL, 5)
        self.m_button2 = wx.Button(self, wx.ID_ANY, u"save",
                             wx.DefaultPosition, wx.DefaultSize, 0)
        bSizer5.Add(self.m_button2, 1, wx.ALL|wx.EXPAND, 5)
        bSizer1.Add(bSizer5, 0, wx.EXPAND, 5)
        self.SetSizer(bSizer1)
        self.Layout()
        self.Centre(wx.BOTH)
        #---
        self.my_bind()
        #---
    def my_bind(self):
        # Connect Events
        #self.Bind(wx.EVT_UPDATE_UI, self.update_gui)
        self.m_button1.Bind(wx.EVT_BUTTON, self.new_rows)
        self.Bind(wx.EVT_CLOSE, self.close_win)
        self.Bind(wx.EVT_TEXT_PASTE, self.paste_cell)
        #self.m_button3.Bind(wx.EVT_BUTTON, self.load_fd)
        self.m_button2.Bind(wx.EVT_BUTTON, self.save_file)
    def make_grid(self, rows):
        self.m_grid2 = wx.grid.Grid(self.m_scrolledWindow1, wx.ID_ANY,
                                        wx.DefaultPosition,
                                        wx.DefaultSize, 0)
        # Grid
        self.m_grid2.CreateGrid(rows, 2)
        self.m_grid2.EnableEditing(True)
        self.m_grid2.EnableGridLines(True)
        self.m_grid2.EnableDragGridSize(True)
        self.m_grid2.SetMargins(0, 0)
        # Columns
        self.m_grid2.SetColSize(0, 150)
        self.m_grid2.SetColSize(1, 150)
        self.m_grid2.EnableDragColMove(False)
        self.m_grid2.EnableDragColSize(True)
        self.m_grid2.SetColLabelSize(30)
        self.m_grid2.SetColLabelAlignment(wx.ALIGN_CENTRE,
                                          wx.ALIGN_CENTRE)
        # Rows
        self.m_grid2.EnableDragRowSize(True)
        self.m_grid2.SetRowLabelSize(80)
        self.m_grid2.SetRowLabelAlignment(wx.ALIGN_CENTRE,
                                          wx.ALIGN_CENTRE)
        # Label Appearance
        # Cell Defaults
        self.m_grid2.SetDefaultCellAlignment(wx.ALIGN_LEFT,
                                             wx.ALIGN_TOP)
        return self.m_grid2
    def __del__(self):
        pass
    # Virtual event handlers, overide them in your derived class
    #def update_gui(self, event):
        #event.Skip()
    def close_win( self, event ):
        exit()
        event.Skip()    
    def new_rows(self, event):
        self.m_grid2.Destroy()
        self.make_grid(self.m_spinCtrl1.GetValue())
        self.bSizer6.Add(self.m_grid2, 1, wx.ALL|wx.EXPAND, 5)
        self.m_scrolledWindow1.SetSizer(self.bSizer6)
        self.m_scrolledWindow1.Layout()
        self.bSizer6.FitInside(self.m_scrolledWindow1)        
        event.Skip()
    #def load_fd(self, event):
        #event.Skip()
    def save_file( self, event ):
        # пример сохранения таблицы в  файл
        with wx.FileDialog(self, "Save csv file",
                           wildcard="csv files (*.csv)|*.csv",
                           style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT
                           ) as fileDialog:
            if fileDialog.ShowModal() == wx.ID_CANCEL:
                return     # the user changed their mind
            # save the current contents in the file
            pathname = fileDialog.GetPath()
            try:
                with open(pathname, 'w') as csvfile:
                    writer = csv.writer(csvfile, delimiter=',',
                                            quotechar='|',
                                            quoting=csv.QUOTE_MINIMAL)
                    for i in range(self.m_grid2.GetNumberRows()):
                        writer.writerow(
                            [self.m_grid2.GetCellValue(i, 0),
                             self.m_grid2.GetCellValue(i, 1)])
            except IOError:
                wx.LogError(
                    "Cannot save current data in file '%s'." \
                    % pathname)
        event.Skip()
        event.Skip()
    def paste_cell(self, event):
        # пример вставки текста в зависимости от его типа
        tmp = [self.m_grid2.GetGridCursorRow(),
               self.m_grid2.GetGridCursorCol()]
        # если вы будете менять, обвешивать итд опцию вствки то
        # основные действия будут происходить в коде ниже поэтому
        # лучше выделить под это отдельную функцию или даже класс
        buf = self.from_buf()
        lenbuf = len(buf[0])
        iterbuf = iter(buf[0])
        if buf[1] == 1:
            # если это таблица то ...
            for i in range(self.m_grid2.GetNumberRows()):
                # здесь нужно подумать какое то оно такое ...
                if i >= tmp[0]:
                    try:
                        temp = next(iterbuf)
                    except Exception as err:
                        print err
                    if len(temp) >= 2:
                        # при вставке таблицы обрезает ее 
                        # до двух столбцов
                        self.m_grid2.SetCellValue(i, 0, temp[0])
                        self.m_grid2.SetCellValue(i, 1, temp[1])
        elif buf[1] == 0:
            # иначе
            self.m_grid2.SetCellValue(tmp[0], tmp[1], buf[0])
        #event.Skip()
    def from_buf(self):
        # пример преобразования значений из текстового буфера
        # то есть берем че в буфере классифицируем это и 
        # подготавливаем данные для дальнейшего использования
        # выдаем данные и что это
        text_data = wx.TextDataObject()
        if wx.TheClipboard.Open():
            success = wx.TheClipboard.GetData(text_data)
            wx.TheClipboard.Close()
        if success:
            text = text_data.GetText()
            # если вы будете менять, обвешивать итд опцию вствки то
            # основные действия будут происходить в коде ниже поэтому
            # лучше выделить под это отдельную функцию или даже класс
            
            # если есть табы и несколько строк то это таблица
            if '\t' in text and '\n' in text:
                return [i.split('\t') for i in text.split('\n')], 1
            else:
                # иначе это просто текст
                return text, 0
class MyApp(wx.App):
    def OnInit(self):
        wx.InitAllImageHandlers()
        frame_1 = MyFrame1(None)
        self.SetTopWindow(frame_1)
        frame_1.Show()
        return 1
if __name__ == "__main__":
    app = MyApp(0)
    app.MainLoop()



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version