PythonWin GUI und Controls

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Nergal
User
Beiträge: 72
Registriert: Montag 6. Oktober 2008, 14:02

Hallo,

nachdem ich auch nach längerem Suchen nichts gefunden habe, hoffe ich daß ihr mir weiterhelfen könnt.

Ich habe vor ein paar Wochen mit Python angefangen und möchte mich nun näher mit GUIs unter PythonWin beschäftigen.

Allerdings habe ich noch große Probleme. Ich kann zB keine Controls beschriften noch habe ich eine Übersicht über alle Controls, die PythonWin zur Verfügung stellt, geschweige denn wie sie angewendet werden. Vor allem ein Beispiel zu einer Art TabbedPane wäre hilfreich.

Kennt ihr Quellen, die mir eine gute Übersicht verschaffen?


Mein jetziger Code sieht momentan so aus, die Grundstruktur ist gewollt und soll nicht geändert werden.

Code: Alles auswählen

import win32ui
import win32con
import pywin.mfc.dialog

BTN_CLOSE     =    1000
BTN_CANCEL    =    1001

def WindowTemplate():
    styleMain = win32con.WS_CAPTION | win32con.WS_SYSMENU | win32con.WS_VISIBLE
    styleButton = win32con.WS_TABSTOP | win32con.WS_VISIBLE | win32con.WS_CHILD | win32con.BS_DEFPUSHBUTTON
    
    DlgWindowTemplate = []
    
    DlgWindowTemplate.append(["", (0, 0, 200, 150), styleMain, None, (8, "MS Sans Serif")])
    DlgWindowTemplate.append(["Button", None, BTN_CLOSE, (148, 130, 46, 14), styleButton])
    DlgWindowTemplate.append(["Button", None, BTN_CANCEL, (96, 130, 46, 14), styleButton])

    return DlgWindowTemplate


def WindowDialog():
    dlg = WindowConfigDialog()

    if dlg.DoModal()==2:
        del(dlg)
        return ""
    else:
        retArg=""
        del(dlg)
        return retArg
    
    
class WindowConfigDialog(pywin.mfc.dialog.Dialog):
    def __init__(self):
        self.dt = WindowTemplate()

        pywin.mfc.dialog.Dialog.__init__ (self, self.dt)

        self.HookCommand(self.OnCancelButton, BTN_CANCEL)
        
        return
    
    
    def OnCancelButton(self, ID, eventCode):
        if eventCode != win32con.BN_CLICKED:
            return
        
        return pywin.mfc.dialog.Dialog.OnCancel(self)
    
    
    def OnInitDialog(self):
        self.SetWindowTest("Titel")
        self.GetDlgItem(BTN_CLOSE).SetWindowTest("Close")
       
        return pywin.mfc.dialog.Dialog.OnInitDialog (self)


if __name__=="__main__":
    WindowDialog()

Allerdings bekomme ich hier zB bei der Methode

Code: Alles auswählen

def OnInitDialog(self) 
den Fehler
(null)
Traceback (most recent call last):
File "E:\Eclipse_3.2_Workspace\Area54\src\gui.py", line 52, in OnInitDialog
self.SetWindowTest("Titel")
File "C:\Program Files\Python25\Lib\site-packages\pythonwin\pywin\mfc\object.py", line 18, in __getattr__
return getattr(o, attr)
AttributeError: SetWindowTest
(null)
win32ui: OnInitDialog() virtual handler (<bound method WindowConfigDialog.OnInitDialog of <__main__.WindowConfigDialog instance at 0x00A9BC88>>) raised an exception


Für jede Art der Hilfe bin ich dankbar.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Nergal hat geschrieben:Ich kann zB keine Controls beschriften
Hallo Nergal!

Du hast dich nur verschrieben. So funktioniert es:

Code: Alles auswählen

    def OnInitDialog(self):
        self.SetWindowText("Titel")
        self.GetDlgItem(BTN_CANCEL).SetWindowText("Cancel")
        self.GetDlgItem(BTN_CLOSE).SetWindowText("Close")
        return pywin.mfc.dialog.Dialog.OnInitDialog (self)
Allerdings weiß ich nicht, ob du dir das wirklich antun willst. Ich kenne niemanden, der unter Python direkt mit der MFC arbeitet. Um das einfacher zu machen und dabei auch plattformunabhängig zu bleiben, gibt es GUI-Framworks wie pyGTK oder wxPython (= mein Favorit).

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Nergal
User
Beiträge: 72
Registriert: Montag 6. Oktober 2008, 14:02

Argh, den Wald vor lauter Bäumen nicht gesehen. Danke ;)

Hab leider keine Wahl es anders zu machen, aber das tut hier nichts zur Sache (teilweise Erweiterung eines bestehenden Programms).

Wo ich eine Onlinehilfe zu dem Thema finden kann weißt du nicht zufällig, oder?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Nergal hat geschrieben:Wo ich eine Onlinehilfe zu dem Thema finden kann weißt du nicht zufällig, oder?
Hallo Nergal!

Das ist ja der Punkt. :? Hilfe bekommst du hauptsächlich über das "Microsoft Platform Software Development Kit" bzw. das MSDN Library.

Vielleicht ist da etwas darunter: http://social.msdn.microsoft.com/Search ... nload&ac=1

Und natürlich in der Hilfe zu pyWin32.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Nergal
User
Beiträge: 72
Registriert: Montag 6. Oktober 2008, 14:02

Danke,

dann werd ich mal das Beste draus machen ;)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo Nergal!

Nur, um dich ein wenig zu ärgern: :twisted:

Bild

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import wx

wx.SetDefaultPyEncoding("iso-8859-15")


class MyDialog(wx.Dialog):
    
    def __init__(self, parent = None, title = "Example-Dialog"):
        wx.Dialog.__init__(self, parent, -1, title)
        
        # Sizer
        vbox_main = wx.BoxSizer(wx.VERTICAL)
        self.SetSizer(vbox_main)
        
        # Liste
        choices = ["A", "B", "C"]
        self.lst_abc = wx.ListBox(self, size = (100, 100), choices = choices)
        vbox_main.Add(self.lst_abc, 1, wx.EXPAND | wx.ALL, 4)
        self.lst_abc.SetSelection(0)
        
        # Buttons
        button_sizer = self.CreateButtonSizer(flags = wx.OK | wx.CANCEL)
        vbox_main.Add(button_sizer, 0, wx.EXPAND | wx.ALL, 4)
        
        # Layout
        self.lst_abc.SetFocus()
        self.Fit()


def main():
    """Testing"""
    app = wx.PySimpleApp()
    app.locale = wx.Locale(wx.LANGUAGE_DEFAULT)
    diag = MyDialog()
    if diag.ShowModal() == wx.ID_OK:
        print diag.lst_abc.GetStringSelection()
    diag.Destroy()


if __name__ == "__main__":
    main()
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Nergal
User
Beiträge: 72
Registriert: Montag 6. Oktober 2008, 14:02

gerold hat geschrieben:Hallo Nergal!
Nur, um dich ein wenig zu ärgern: :twisted:
Geschafft :wink:

Leider wär's eine Menge Code, der umgeändert werden müßte.
Antworten