Een statische tekst aan een afzonderlijk paneel toevoegen in een afzonderlijke klasse (wxpython)

Ik heb een notebook, die een eigen klasse heeft, in die notebook heb ik een controleknop, ik probeer die knop te binden om de statische tekst weer te geven op een apart paneel dat zich in een aparte klasse bevindt.

Ex.

class ButtonPage(wx.Notebook)
    def __init__(etc.....):
        but_img = wx.Bitmap('./button.png',wx.BITMAP_TYPE_PNG)
    self.but_img = wx.StaticBitmap(self,bitmap=but_img,pos=((10,170)),style=wx.NO_BORDER)

class PanelPage(wx.Frame)
    def __init__(etc....)
    self.mainPanel = wx.Panel(self,etc....)

Dus hoe bind ik deze knop in de 'Knoppagina' om een ​​statictext op de PanelPage te tonen als ze zich in twee afzonderlijke klassen bevinden. Ik gebruik om de ouder van de knop te maken (zelf) maar te zien zoals in dit geval heeft het geen zin om dit te doen ....

Bewerken: ok ik heb het echt uitgezocht. Maar om de een of andere reden reageert wx.StaticText niet op EVT-oproepen. Om het even welke ideeën waarom dit is? manieren omheen?

1
ja ru de

2 antwoord

Ik begrijp niet wat je wilt. StaticText is slechts een label. De gebruiker heeft geen interactie met labels, dus er zijn echt geen evenementen voor deze widget. Misschien kun je sommige muisgebeurtenissen binden voor het gedeelte van het scherm waarop het label staat, maar ik denk dat dat het is.

Een goede manier om in wxPython twee klassen met elkaar te laten praten is door pubsub te gebruiken. Hier is een tutorial voor u http://www.blog.pythonlibrary.org/2010/06/27/wxpython-and-pubsub-a-simple-tutorial/

EDIT: Als u wilt wijzigen welke pagina in een notebook wordt weergegeven, gebruikt u de methode SetSelection() van het Notebook of de methode ChangeSelection. Ervan uitgaande dat beide panelen zich in dezelfde notebook bevinden, zou je de Notebook-instantie gewoon bellen om van pagina te veranderen. Dat zou ook zonder pubs moeten werken.

Als je het echter hebt over iets buiten de notebook, dan is de pubsub-methode zeker de juiste keuze.

0
toegevoegd
Oke. Dat is logisch.
toegevoegd de auteur Mike Driscoll, de bron
Hij is niet op zoek om rechtstreeks met het label te communiceren, alleen bijwerken/tonen wanneer een knop wordt ingedrukt op een ander paneel
toegevoegd de auteur GP89, de bron

Voor een beetje een vuile oplossing kun je bijvoorbeeld via de init-methode een verwijzing naar de StaticText doorgeven aan je 'Knoppagina', dan kun je een methode in de klasse Knoppagina binden aan de EVT_BUTTON -gebeurtenis en bellen < code> SetLabel op het label vanaf daar.

Een iets leukere oplossing is echter om dit op bovenliggend niveau te doen, door de geluiden van dingen die de ButtonPage en PanelPages broers en zussen op een notebook zijn, dus je zou de knop in de ButtonPage uit de notebookklasse kunnen binden, en dezelfde methode als hierboven gebruiken . Het is iets leuker als een ouder dit doet in plaats van een verwijzing door te geven van het object/de methode van een broer of zus.

Ik dacht dat ik dit zou noemen als het maar een klein project is en je iets snel moet laten werken

Als alternatief is de Mikes-oplossing iets meer werk om in te stellen en te begrijpen (maar het is de moeite waard). Het is beter leesbaar, en het gebruik van bovenstaande oplossing zal de code behoorlijk 'koppelen' en als dingen in de toekomst veranderen, heb je een beetje een rotzooi om te ontwarren.

0
toegevoegd