Форум сайта python.su
Всем доброго времени суток! Ввиду производственной необходимости только приступил к изучению Python. Прошу помощи у маститых программистов. Думаю, для Вас задача тривиальная.
Имеется переменная, обозначающая количество проб — N, это количество пользователь вносит в поле ввода Entry (GUI). Допустим, = 5. В той же GUI-форме создается таблица 2х5 (два столбца, пять строк), в которую пользователь переносит данные из таблицы, находящейся в другом документе. Таблица сохраняется в .xlsx
В-принципе, массив с данными может сохраняться в любом формате, лишь бы можно было легко ее скопировать (открыть в блокноте) и перенести в .xlsx
При N=50, создается таблица 2х50.
Отредактировано taxol (Янв. 9, 2020 23:00:20)
Офлайн
че надо то gui? xlsx?
Отредактировано AD0DE412 (Янв. 10, 2020 15:45:55)
Офлайн
Необходим GUI. Допустим, есть однострочное текстовое поле, куда пользователь вводит число. Пусть это будет 25. Тут же выводится таблица с количеством строк 25. В эти строки пользователь вбивает данные и сохраняет в любом формате.
Офлайн
taxolЯ наверное чегото не понимаю. Мне постановка задачи кажется абсурдной.
лишь бы можно было легко ее скопировать (открыть в блокноте) и перенести в .xlsx
Офлайн
# -*- 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 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_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() 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()
Отредактировано AD0DE412 (Янв. 11, 2020 13:23:07)
Офлайн
За скрипт премного благодарен, отписался в личку. А по поводу того, зачем это нужно… Есть около десяти операторов, они скрывают строки с ранее забитыми результатами, удаляют строки, что сбивает исходную форму, бьют непонятные данные поверх уже имеющихся и т.п. И взывать к порядочности и топить за дисциплину просто бессмысленно. Да, бывает и такое. А когда есть форма с жесткими рамками, все становится на свои места.
Офлайн
taxolЧегото я не знаток эксел. Что такое скрытие строк?
они скрывают строки с ранее забитыми результатами
!/usr/bin/env python # -*- coding: UTF-8 -*- import wx import wx.grid NROW=5 class Form(wx.Frame): def __init__(self, *args, **kwds): kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_FRAME_STYLE wx.Frame.__init__(self, *args, **kwds) self.SetSize((600, 400)) self.grid = wx.grid.Grid(self, wx.ID_ANY, size=(NROW, 2)) self.grid.CreateGrid(NROW, 2) self.button_save = wx.Button(self, wx.ID_ANY, "save") self.__do_layout() def __do_layout(self): sizer_1 = wx.BoxSizer(wx.VERTICAL) sizer_1.Add(self.grid, 1, wx.EXPAND, 0) sizer_1.Add(self.button_save, 0, wx.EXPAND, 0) self.SetSizer(sizer_1) self.Layout() class MyApp(wx.App): def OnInit(self): self.frame = Form(None, wx.ID_ANY, "") self.SetTopWindow(self.frame) self.frame.Show() return True # end of class MyApp if __name__ == "__main__": app = MyApp(0) app.MainLoop()
Отредактировано doza_and (Янв. 12, 2020 09:57:27)
Офлайн
ну вот и зубры подтянулись а не школота какаята :)
doza_andконечно певым делом подумалось про …
Для таблиц вообще есть специальный контрол с которым удобнее и поьзователям работать и програмисту.
taxolв общем все по ТЗ
вносит в поле ввода
Отредактировано AD0DE412 (Янв. 12, 2020 20:41:17)
Офлайн
AD0DE412Это вопрос?
doza_and вы в ручную код писали или вычищали код после конструктора
Офлайн
Всем большое спасибо за содействие! Тут лички нет, по донату отписался на почту. Скажите, можно ли на базе предложенного AD0DE412 алгоритма вносить данные не в каждую ячейку, а вставлять сразу массивом? Т.е. скопировали ячейки с A1 по B25 и вставили в форму? Чтобы не тратить время на написание нового скрипта, хотя бы натолкните на мысль.
А за нерадивость в описании ТЗ прошу прощения. Впредь такого не повторится.
Отредактировано taxol (Янв. 13, 2020 00:15:33)
Офлайн