Latest posts on [wxPython] Auto wrap и перенос строк в Grid topichttps://python.su/forum/topic/11317/2020-12-06T08:14:16+02:00Общий :: GUI :: [wxPython] Auto wrap и перенос строк в Grid
2020-12-06T08:14:16+02:00@cckyi_boxxx213335решение походу умерло с обновками <span style="font-size:10px">(как и остальное что нашлось в сети)</span>, приделал к нему кривой костыль, выкладываю тут думаю это частая проблема, вдруг кому пригодится:<br/><br/><div class="code"><pre> <span class="k">class</span> <span class="nc">CutomGridCellAutoWrapStringRenderer</span><span class="p">(</span><span class="n">wx</span><span class="o">.</span><span class="n">grid</span><span class="o">.</span><span class="n">GridCellRenderer</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">wx</span><span class="o">.</span><span class="n">grid</span><span class="o">.</span><span class="n">GridCellRenderer</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">Draw</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">grid</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="n">dc</span><span class="p">,</span> <span class="n">rect</span><span class="p">,</span> <span class="n">row</span><span class="p">,</span> <span class="n">col</span><span class="p">,</span> <span class="n">isSelected</span><span class="p">):</span>
<span class="n">text</span> <span class="o">=</span> <span class="n">grid</span><span class="o">.</span><span class="n">GetCellValue</span><span class="p">(</span><span class="n">row</span><span class="p">,</span> <span class="n">col</span><span class="p">)</span>
<span class="n">dc</span><span class="o">.</span><span class="n">SetFont</span><span class="p">(</span> <span class="n">attr</span><span class="o">.</span><span class="n">GetFont</span><span class="p">()</span> <span class="p">)</span>
<span class="n">text</span> <span class="o">=</span> <span class="n">wordwrap</span><span class="o">.</span><span class="n">wordwrap</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">grid</span><span class="o">.</span><span class="n">GetColSize</span><span class="p">(</span><span class="n">col</span><span class="p">),</span> <span class="n">dc</span><span class="p">,</span> <span class="n">breakLongWords</span> <span class="o">=</span> <span class="bp">False</span><span class="p">)</span>
<span class="c1"># начало моего костыля</span>
<span class="n">numlines</span> <span class="o">=</span> <span class="n">text</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
<span class="n">defrowsize</span> <span class="o">=</span> <span class="n">grid</span><span class="o">.</span><span class="n">GetDefaultRowSize</span><span class="p">()</span>
<span class="n">currowsize</span> <span class="o">=</span> <span class="n">grid</span><span class="o">.</span><span class="n">GetRowSize</span><span class="p">(</span><span class="n">row</span><span class="p">)</span>
<span class="n">needrowsize</span> <span class="o">=</span> <span class="n">currowsize</span> <span class="o">//</span> <span class="n">defrowsize</span>
<span class="k">if</span> <span class="n">numlines</span> <span class="o">></span> <span class="n">needrowsize</span><span class="p">:</span>
<span class="n">newrowsize</span> <span class="o">=</span> <span class="n">numlines</span> <span class="o">*</span> <span class="n">defrowsize</span>
<span class="n">grid</span><span class="o">.</span><span class="n">SetRowSize</span><span class="p">(</span><span class="n">row</span><span class="p">,</span> <span class="n">newrowsize</span><span class="p">)</span>
<span class="c1"># конец моего костыля</span>
<span class="n">hAlign</span><span class="p">,</span> <span class="n">vAlign</span> <span class="o">=</span> <span class="n">attr</span><span class="o">.</span><span class="n">GetAlignment</span><span class="p">()</span>
<span class="k">if</span> <span class="n">isSelected</span><span class="p">:</span>
<span class="n">bg</span> <span class="o">=</span> <span class="n">grid</span><span class="o">.</span><span class="n">GetSelectionBackground</span><span class="p">()</span>
<span class="n">fg</span> <span class="o">=</span> <span class="n">grid</span><span class="o">.</span><span class="n">GetSelectionForeground</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">bg</span> <span class="o">=</span> <span class="n">attr</span><span class="o">.</span><span class="n">GetBackgroundColour</span><span class="p">()</span>
<span class="n">fg</span> <span class="o">=</span> <span class="n">attr</span><span class="o">.</span><span class="n">GetTextColour</span><span class="p">()</span>
<span class="n">dc</span><span class="o">.</span><span class="n">SetTextBackground</span><span class="p">(</span><span class="n">bg</span><span class="p">)</span>
<span class="n">dc</span><span class="o">.</span><span class="n">SetTextForeground</span><span class="p">(</span><span class="n">fg</span><span class="p">)</span>
<span class="n">dc</span><span class="o">.</span><span class="n">SetBrush</span><span class="p">(</span><span class="n">wx</span><span class="o">.</span><span class="n">Brush</span><span class="p">(</span><span class="n">bg</span><span class="p">,</span> <span class="n">wx</span><span class="o">.</span><span class="n">SOLID</span><span class="p">))</span>
<span class="n">dc</span><span class="o">.</span><span class="n">SetPen</span><span class="p">(</span><span class="n">wx</span><span class="o">.</span><span class="n">TRANSPARENT_PEN</span><span class="p">)</span>
<span class="n">dc</span><span class="o">.</span><span class="n">DrawRectangle</span><span class="p">(</span><span class="n">rect</span><span class="p">)</span>
<span class="n">grid</span><span class="o">.</span><span class="n">DrawTextRectangle</span><span class="p">(</span><span class="n">dc</span><span class="p">,</span> <span class="n">text</span><span class="p">,</span> <span class="n">rect</span><span class="p">,</span> <span class="n">hAlign</span><span class="p">,</span> <span class="n">vAlign</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">GetBestSize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">grid</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="n">dc</span><span class="p">,</span> <span class="n">row</span><span class="p">,</span> <span class="n">col</span><span class="p">):</span>
<span class="n">text</span> <span class="o">=</span> <span class="n">grid</span><span class="o">.</span><span class="n">GetCellValue</span><span class="p">(</span><span class="n">row</span><span class="p">,</span> <span class="n">col</span><span class="p">)</span>
<span class="n">dc</span><span class="o">.</span><span class="n">SetFont</span><span class="p">(</span><span class="n">attr</span><span class="o">.</span><span class="n">GetFont</span><span class="p">())</span>
<span class="n">text</span> <span class="o">=</span> <span class="n">wordwrap</span><span class="o">.</span><span class="n">wordwrap</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">grid</span><span class="o">.</span><span class="n">GetColSize</span><span class="p">(</span><span class="n">col</span><span class="p">),</span> <span class="n">dc</span><span class="p">,</span> <span class="n">breakLongWords</span> <span class="o">=</span> <span class="bp">False</span><span class="p">)</span>
<span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">lineHeight</span> <span class="o">=</span> <span class="n">dc</span><span class="o">.</span><span class="n">GetMultiLineTextExtent</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
<span class="k">return</span> <span class="n">wx</span><span class="o">.</span><span class="n">Size</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">Clone</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">CutomGridCellAutoWrapStringRenderer</span><span class="p">()</span>
</pre></div><br/>затем остается лишь у вашего Grid вызвать SetDefaultRenderer(CutomGridCellAutoWrapStringRenderer()) и порядок, костыль кривой но рабочий.<br/><br/>PS: подозреваю что это должно лечиться легче, стандартными средствами wx, но я пока полностью не изучил его, из опробованного все стандартное отказало в работе wx.grid.GridCellAutoWrapStringRenderer() и wx.grid.GridCellAutoWrapStringEditor(), ну либо я криворучка))). Позже возможно выкину из этого класса лишнее, когда пойму что можно выкинуть.
Общий :: GUI :: [wxPython] Auto wrap и перенос строк в Grid
2011-05-09T13:54:41+03:00Vader71676Решение <a href="http://stackoverflow.com/questions/5868280/auto-wrap-and-newlines-in-wxpython-grid">здесь</a>
Общий :: GUI :: [wxPython] Auto wrap и перенос строк в Grid
2011-05-03T11:27:45+03:00Vader71324Итак, нужно, чтобы текст в ячейках таблицы:<br/>1. Переносился на новую строку, если он длиннее, чем ширина ячейки (auto wrap)<br/>2. Воспринимал \n как перенос строки<br/>т.е. нужно получить поведение ячеки такое же, как в обычных табличных редакторах вроде Excel.<br/>Пытаюсь сделать приблизительно так:<br/><div class="code"><pre>import wx <br/>import wx.grid <br/><br/>class MyGrid(wx.grid.Grid): <br/><br/> def __init__(self, parent = None, style = wx.WANTS_CHARS): <br/> <br/> wx.grid.Grid.__init__(self, parent, -1, style = style) <br/> <br/> self.CreateGrid(10, 10) <br/> <br/> self.editor = wx.grid.GridCellAutoWrapStringEditor() <br/> self.SetDefaultEditor(self.editor)<br/> <br/> self.SetDefaultRenderer(wx.grid.GridCellAutoWrapStringRenderer()) <br/> <br/> self.SetCellValue(0, 0, "Line1\nLine2\nLine3") <br/> self.SetRowSize(0, 100) <br/><br/><br/>class MyFrame(wx.Frame): <br/> <br/> def __init__(self, parent = None, title = "Multiline"): <br/> <br/> wx.Frame.__init__(self, parent, -1, title) <br/> <br/> self.Bind(wx.EVT_CHAR_HOOK, self.on_frame_char_hook) <br/> <br/> panel = wx.Panel(self) <br/> <br/> vbox = wx.BoxSizer(wx.VERTICAL) <br/> panel.SetSizer(vbox) <br/> <br/> grid = MyGrid(panel) <br/> vbox.Add(grid, 1, wx.EXPAND | wx.ALL, 5) <br/> self.grid = grid <br/> <br/> btn_exit = wx.Button(panel, -1, "Exit") <br/> vbox.Add(btn_exit, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 10) <br/> <br/> <br/> def on_frame_char_hook(self, event): <br/> <br/> if event.CmdDown() and event.GetKeyCode() == wx.WXK_RETURN: <br/> if self.grid.editor.IsCreated(): <br/> self.grid.editor.StartingKey(event) <br/> else: <br/> event.Skip <br/> else: <br/> event.Skip() <br/> <br/> <br/>def main(): <br/> <br/> app = wx.PySimpleApp() <br/> f = MyFrame() <br/> f.Center() <br/> f.Show() <br/> app.MainLoop() <br/><br/><br/>if __name__ == "__main__": <br/> main()</pre></div>Так вот, проблема в том, что в editor'e ячейчки все выглядит именно так как мне нужно, а вот в renderer'e переносы строки сделанные вручную (\n) игнорируются. Если же убрать self.SetDefaultRenderer(wx.grid.GridCellAutoWrapStringRenderer()), то \n начинает отображаться адекватно, но при этом auto wrap, естественно, не работает.<br/>Как победить?