Merkwürdiges Verhalten bei Doppelclick auf disabled Splitter

Plattformunabhängige GUIs mit wxWidgets.
Antworten
ElSids
User
Beiträge: 16
Registriert: Montag 25. Juni 2007, 13:15
Wohnort: Corciano/Italien

Der folgende Code bildet ein normales Frame mit 2 SplitterWindows und 3 Panels). Alles funktioniert erwartungsgemäß. Die Sashbalken lassen sich verschieben und die Panels ´wachsen´ mit der Vergrößerung des Frame-Borders.
Danach Klicke auf Button "Disable Hsplitter".
Alles funktioniert wie es sollte (Sashs, Borderänderung)

Versuche nun ein Doppelklick auf eines der rechten SplitterWindows mit den ListCtrls.
Die SplitterWindows sind plötzlich weg, d.h. unsichtbar geworden, aber nicht gelöscht (destroyed).

Mit einem Klick auf Button "Show Splitter" kann man sie wieder sichtbar werden lassen.
Doch fehlt der vertikale Sashbalken, der Sashbalken der hsplitter ist da und funktioniert normal. Verschiebe nun den Boder des Frames und siehe da der hsplitter wächst nicht mehr mit. Weitere Veränderungen des Frame-Border verbergen noch weitere Überraschungen.

Hat jemand hierfür eine Erklärung parat ?
ElSids

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import wx

class PanelLeft(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, -1, style=wx.WANTS_CHARS)
        self.SetBackgroundColour("red")
        vbox = wx.BoxSizer(wx.VERTICAL)
        self.btn_disable = wx.Button(self,-1,u"Disable Hsplitter")
        self.btn_show = wx.Button(self,-1, u"Show Splitter")
        vbox.Add(self.btn_disable, 0, wx.ALL,10)
        vbox.Add(self.btn_show, 0, wx.ALL,10)
        self.SetSizer(vbox)
                
        self.Bind(wx.EVT_BUTTON, self.OnDisable, self.btn_disable)
        self.Bind(wx.EVT_BUTTON, self.OnShow, self.btn_show)

    def GetHsplitter(self):
        app = wx.GetApp()
        hsplitter = app.insert_frame.hsplitter
        return hsplitter

    def OnDisable(self, evt):
        hsplitter = self.GetHsplitter()
        hsplitter.Enable(False)

    def OnShow(self, evt):
        hsplitter = self.GetHsplitter()
        hsplitter.Show(True)
        hsplitter.Enable(True)
        hsplitter.Refresh()

class RightTop(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.SetBackgroundColour("blue")
        self.columns = [u"top_head1", u"top_head2", u"top_head3"]
        self.elenco = wx.ListCtrl(self, -1, style=wx.LC_REPORT)
        vbox = wx.BoxSizer(wx.VERTICAL)
        vbox.Add(self.elenco,1,wx.GROW | wx.ALL,10)
        self.SetSizer(vbox)
        self.FillList()

    def FillList(self):
        for col, text in enumerate(self.columns):
            self.elenco.InsertColumn(col, text)
            self.elenco.SetColumnWidth(0, 80)
            self.elenco.SetColumnWidth(1, 80)
            self.elenco.SetColumnWidth(2, 80)

class RightBottom(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.SetBackgroundColour("green")
        self.columns = [u"btm_head1", u"btm_head2", u"btm_head3"]
        self.elenco2 = wx.ListCtrl(self, -1, style=wx.LC_REPORT)
        vbox = wx.BoxSizer(wx.VERTICAL)
        vbox.Add(self.elenco2,1,wx.GROW | wx.ALL,10)
        self.SetSizer(vbox)
        self.FillList()

    def FillList(self):
        for col, text in enumerate(self.columns):
            self.elenco2.InsertColumn(col, text)
            self.elenco2.SetColumnWidth(0, 80)
            self.elenco2.SetColumnWidth(1, 80)
            self.elenco2.SetColumnWidth(2, 80)       

class MainFrame(wx.Frame):
    def __init__(self,parent,id):
        wx.Frame.__init__(
                self, parent, id, title="MainFrame", size = (500,400),
                style = wx.DEFAULT_FRAME_STYLE)
        main_panel = wx.Panel(self)
        main_border = wx.BoxSizer(wx.VERTICAL)
        main_panel.SetSizer(main_border)
        main_panel.SetBackgroundColour("white")
        self.vsplitter = wx.SplitterWindow(main_panel, -1,
                                           style= wx.SP_3D | wx.SP_BORDER)
        self.hsplitter = wx.SplitterWindow(self.vsplitter, -1,
                                           style = wx.SP_3D | wx.SP_BORDER)

        self.left_pane = PanelLeft(self.vsplitter)
        self.top_pane = RightTop(self.hsplitter)
        self.bottom_pane = RightBottom(self.hsplitter)

        self.hsplitter.SplitHorizontally(self.top_pane, self.bottom_pane)
        self.vsplitter.SplitVertically(self.left_pane, self.hsplitter)
        main_border.Add(self.vsplitter, 1, wx.GROW | wx.ALL)

class MyApp(wx.PySimpleApp):
    def OnInit(self):
        self.show_insert_frame()
        return True

    def show_insert_frame(self):
        self.insert_frame = MainFrame(None,-1)
        self.insert_frame.Show()

app=MyApp()
app.MainLoop()
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Das Problem kann ich bei mir (Debian testing, Python 2.5, wx 2.8 ) nicht nachvollziehen. Die einzige Auswirkung, die der Disable-Button hat, ist, dass ich in dem rechten Panel nichts mehr machen kann, aber es wird alles genauso dargestellt wie bisher (ausser dass eventuell vorhandene Scrollbalken an den ListCtrls ausgegraut werden). Der vertikale Sash funktioniert. Klicke ich dann auf Show Splitter, ist alles wieder so wie vorher.

PS: Emacs hat gemeckert, das UTF im Coding-Tag gross geschrieben ist...
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
ElSids
User
Beiträge: 16
Registriert: Montag 25. Juni 2007, 13:15
Wohnort: Corciano/Italien

Hallo Rebecca,

erstmal hätte richtigerweise hinzufügen sollen, dass ich unter WindowsXP arbeite und ebenfalls python 2.5 und wx 2.8 verwende.
Aus deiner Antwort ersehe ich, dass ich mich womöglich ungeschickt ausgedrückt habe.
Auch unter Windows verursacht der Button-Click keine Unregelmäßigkeiten.
Das Problem ergibt sich, wenn man nach dem Button-Klick auf "Disable Hsplitter", also wenn das rechte Splitter ´disabled´ wird, ein Doppelklick auf das rechte Splitter setzt.

Ich dachte, dass ein

Code: Alles auswählen

wxobject.Enable(False)
alle Mouse- und Tastatureingaben einfriert, oder genauer gesagt, registriert aber nicht ausgeführt. Scheinbar ist dem jedoch nicht so.

P.S emacs und Großschreibung von "coding: UTF-8", ich weiß nicht woher ich diese Großschreibung habe, zumindest:

Code: Alles auswählen

>>>s = "Ein Text"
>>>u = unicode(s, "UTF-8")
>>>v = unicode(s, "utf-8")
>>>u
>>>u"Ein Text"
>>>v
>>>u"Ein Text"
ergibt dasselbe (oder nur das gleiche?)
Wie dem auch sei, ich denke emacs hat recht und ich werde nun klein schreiben.
ElSids
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Ah, ok. Aber auch nach dem Doppelclick scheint das Problem bei mir nicht aufzutreten. Wenn hier sonst keiner eine Idee hat, wuerde ich mal auf der wx-Mailingliste nachfragen. Vllt ist es ein Bug.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Hi,
bei mir verschwinden die beiden rechten Panels wenn ich auf den senkrechten Splitter doppelklicke, aber egal ob ich vorher auf disable geklickt hab oder nicht

EDIT: Wenn ich auf den horizontalen Splitter klicke verschwindet das grüne Panel und taucht auch nicht mehr auf. Außerdem ist mir aufgefallen das die Splitter nicht richtig neu gezeichnet werden wenn man die Fenstergröße verändert
Antworten