Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: PyGTK programmeren  (gelezen 4814 keer)

PyGTK programmeren
« Gepost op: 2009/06/04, 17:05:09 »
Hallo.

Ik ben bezig met het maken van een programma, en loop af en toe wel eens tegen een probleempje aan.
Meestal kan ik het vinden op internet maar nu niet.

Aangezien ik verwacht dat er nog meerdere problemen zullen komen heb ik het topic wat algemener gelaten.

Mijn vraag (voor nu) is: Hoe krijg ik het voor mekaar om het kruisje uit de titelbalk te halen, zodat de gebruiker het niet kan wegklikken.
ik heb het geptobeert met:
window.set_deletable(False)Maar dat helpt niet.

En (vraag 2):
Wat moet ik achter pygtk.require zetten? Volgens hun eigen tut 2.0, maar is dat nog steeds zo?
Volop Ubuntu 12.04 gebruiker.

Re: PyGTK programmeren
« Reactie #1 Gepost op: 2009/06/04, 18:34:55 »
window.set_decorated(False)Maar dan is heel de kader wel weg.

Het volgende klopt nog steeds:
import pygtk; pygtk.require('2.0')

Edit: over set_deletable:
Citaat
By default, windows have a close button in the window frame. Some window managers allow GTK+ to disable this button. If you set the deletable property to False using this method, GTK+ will do its best to convince the window manager not to show a close button. Depending on the system, this method may not have any effect when called on a window that is already visible, so you should call it before calling gtk_window_show().

Toch wat belangrijke info.
« Laatst bewerkt op: 2009/06/04, 18:37:06 door Nunslaughter »

Re: PyGTK programmeren
« Reactie #2 Gepost op: 2009/06/04, 19:19:51 »
Dat eerste is nou ook weer niet de bedoeling, will do its best waarom zou het niet lukken?
En als het dan zo vaak niet lukt, waarom dan toch deze optie.
call it before calling gtk_window_show() heb ik gedaan
helaas, is dit de enigste optie dan, of zijn er meerdere.

call it before calling gtk_window_show() moet lijkt mij call it before calling gtk_window.show() zijn
« Laatst bewerkt op: 2009/06/04, 19:23:12 door rick.blub »
Volop Ubuntu 12.04 gebruiker.

Re: PyGTK programmeren
« Reactie #3 Gepost op: 2009/06/04, 20:01:36 »
Ok, het was ook een optie natuurlijk.

Ik heb hier een tijd geleden een simpel PyGTK script gezet, even hierop uitgeprobeerd en het lukt.
#!/usr/bin/env python

import pygtk
pygtk.require('2.0')
import gtk


def button_clicked(widget):
    label.set_text("Button clicked!")


if __name__ == "__main__":
    window = gtk.Window(gtk.WINDOW_TOPLEVEL)
    window.resize(150, 50)
    window.set_deletable(False)
    window.connect('delete-event', gtk.main_quit)

    vbox = gtk.VBox()

    label = gtk.Label()
    vbox.pack_start(label, padding=4)

    button = gtk.Button("Click me!")
    button.connect('clicked', button_clicked)
    vbox.pack_start(button)

    window.add(vbox)
    window.show_all()

    gtk.main()

Re: PyGTK programmeren
« Reactie #4 Gepost op: 2009/06/05, 20:58:47 »
Ik ga het later nog eens proberen, zit nu op andere pc.
Is die optie er ook dat je hem niet kan minimaliseren?

En op welke manier kan ik zo'n programma op Windows laten draaien?
Volop Ubuntu 12.04 gebruiker.

Re: PyGTK programmeren
« Reactie #5 Gepost op: 2009/06/05, 21:20:55 »
Als ge set_resizable(False) set, dan kunt ge ook niet minimaliseren normaal. Maar dat moet ik even checken om zeker te zijn.

Er zijn 2 manieren om het op windows te laten werken.
1) Python, GTK+ en PyGTK op windows installeren
Maar dit is natuurlijk niet handig als ge het wilt gaan verspreiden.

2) Een exe maken met Python, GTK+ en PyGTK in gebundeld met bijvoorbeeld py2exe.
Dit kan op het begin wat moeilijk gaan, maar als ge door hebt hoe het fatsoenlijk werkt, gaat het heel goed.

Re: PyGTK programmeren
« Reactie #6 Gepost op: 2009/06/05, 21:45:34 »
In eerste instantie was het gewoon voor mijzelf, omdat op de andere pc geen linux staat, en ik dan ook daarop verder kan.

En hoe moet ik mij punt 2 voorstellen? want die snap ik niet helemaal.
Volop Ubuntu 12.04 gebruiker.

Re: PyGTK programmeren
« Reactie #7 Gepost op: 2009/06/05, 22:37:17 »
Ja, dat puntje 2 is wel even inlezen. Ik zal even zeggen waar het op neer komt, en als het zover is, kan ik u wel verder helpen.

Let wel, dit kan soms echt een zootje zijn (leve pakkettensysteem :)).
Zorg dat ge Python, GTK+ en PyGTK geinstalleerd hebt op uw pc. Test een paar programma's om te kijken of ze werken (zoniet is er iets mis). Installeer dan ook py2exe.
Py2exe werkt met een setupfile zoals distutils. Een voorbeeldje:
from distutils.core import setup
import py2exe

setup(
    name = "Programma Naam",
    description = "Omschrijving van programma",
    version = "0.1",
    windows = [
        {"script": "programma.py",
        "icon_resources": [(1, "programma.ico")]
        }
    ],
    options={"py2exe": {
        "includes": "pango,pangocairo,atk,gobject"}
    }
    data_files=[("programma.cfg"),
                ("pixmaps", "images/*.png")),
                ("glade", "glade/*.glade"))
    ],
)

Dit moet natuurlijk volledig aangepast worden. Hiermee maakt ge dan een package met het volgende commando:
python setup.py py2exe
Voor GTK programma's moeten dan nog wat mappen uit de GTK installatie worden gekopieerd, en dan zou het moeten lukken.

Re: PyGTK programmeren
« Reactie #8 Gepost op: 2009/06/06, 11:43:56 »
is het dan niet makkelijker om gewoon zelf een installatiepakket te maken waarbij hij gewoon gtk, python en pygtk installeerd. En vervolgens het programma er ook op zet?
Volop Ubuntu 12.04 gebruiker.

Re: PyGTK programmeren
« Reactie #9 Gepost op: 2009/06/06, 11:59:15 »
Als ge set_resizable(False) set, dan kunt ge ook niet minimaliseren normaal. Maar dat moet ik even checken om zeker te zijn.

Helaas, je kunt hem dan niet maximaliseren en niet op volledig scherm zetten, maar wel minimaliseren.
Volop Ubuntu 12.04 gebruiker.

Re: PyGTK programmeren
« Reactie #10 Gepost op: 2009/06/06, 12:02:23 »
Geen idee of dat zo goed is. Deze onderdelen hebben zelf een installer, volgens mij is het dan niet zo handig.

Als ge eenmaal een fatsoenlijk setup.py script hebt, is het maar kwestie om zelf een scriptje te schrijven dat dit uitvoert en de juiste bestanden en/of mappen kopieert. Ik moet ondertussen maar een script aanklikken dat de juiste bestanden van mijn Ubuntu-partitie haalt, daar een windowsprogramma van compileert, de juiste GTK mappen erbij zet, een package ervan maakt en deze op de Ubuntu-partitie zet.
Het is even werk en uitzoeken, maar erna is het poepsimpel.

Ahja, gui2exe kan hierbij wel helpen.

Re: PyGTK programmeren
« Reactie #11 Gepost op: 2009/06/06, 12:07:46 »
Ok, het was ook een optie natuurlijk.

Ik heb hier een tijd geleden een simpel PyGTK script gezet, even hierop uitgeprobeerd en het lukt.
#!/usr/bin/env python

import pygtk
pygtk.require('2.0')
import gtk


def button_clicked(widget):
    label.set_text("Button clicked!")


if __name__ == "__main__":
    window = gtk.Window(gtk.WINDOW_TOPLEVEL)
    window.resize(150, 50)
    window.set_deletable(False)
    window.connect('delete-event', gtk.main_quit)

    vbox = gtk.VBox()

    label = gtk.Label()
    vbox.pack_start(label, padding=4)

    button = gtk.Button("Click me!")
    button.connect('clicked', button_clicked)
    vbox.pack_start(button)

    window.add(vbox)
    window.show_all()

    gtk.main()
Helaas, werk nog niet.
Heb script gekopieerd en uitgevoerd, maar helaas
Volop Ubuntu 12.04 gebruiker.

Re: PyGTK programmeren
« Reactie #12 Gepost op: 2009/06/06, 12:29:51 »
Dan moet het toch aan uw thema liggen ofzo. Ik gebruik het Dust thema en het werkt perfect.

Re: PyGTK programmeren
« Reactie #13 Gepost op: 2009/06/06, 12:48:33 »
Gebruik standaard thema van Ubuntu, klikt niet logisch dat dat niet zou werken.

Ook bij andere thema's werkt het niet.
« Laatst bewerkt op: 2009/06/06, 12:50:30 door rick.blub »
Volop Ubuntu 12.04 gebruiker.

Re: PyGTK programmeren
« Reactie #14 Gepost op: 2009/06/06, 17:06:34 »
Nieuwe vraag:
Kan je ook een knop verbinden met een functie uit een andere class?
Want dat krijg ik nog niet voor mekaar.
Volop Ubuntu 12.04 gebruiker.

Re: PyGTK programmeren
« Reactie #15 Gepost op: 2009/06/06, 18:16:07 »
Ow, al antwoord gegeven in het andere topic. Zal hier anders opnieuw zetten en verder gaan.
Dat kan zeker.

class Programma:
    def __init__(self):
        # Uw programma initialiseren

        self.button.connect("clicked", button_clicked)

        self.functie = FunctieKlasse()

    def button_clicked(self, widget):
        self.functie.test_functie()

class FunctieKlasse:
    def __init__(self):
        pass

    def test_functie():
        print "Button clicked"


Over het vorige. Probeer eens uw dialoog modaal te maken. Bij mij kan deze dan niet geminimaliseerd worden (denk toch dat het hieraan ligt).
set_modal(True)

Re: PyGTK programmeren
« Reactie #16 Gepost op: 2009/06/07, 18:39:40 »
Kan het ook zo?:
class Programma:
    def __init__(self):
        # Uw programma initialiseren
        self.functie = FunctieKlasse()
        self.button.connect("clicked", self.functie.test_functie)

class FunctieKlasse:
    def __init__(self):
        pass

    def test_functie():
        print "Button clicked"
Volop Ubuntu 12.04 gebruiker.

Re: PyGTK programmeren
« Reactie #17 Gepost op: 2009/06/07, 19:38:46 »
Ja zou wel moeten. Wel even opletten, want hij gaat ook de widget meegeven aan de callback.
Dus die functie moet volgende worden: (ik zie dat ik "self" ook was vergeten hierboven)
    def test_functie(self, widget):
        print "Button clicked"

Re: PyGTK programmeren
« Reactie #18 Gepost op: 2009/06/07, 19:46:41 »
Dat hij die ook meegeeft klinkt redelijk logisch. :P
Volop Ubuntu 12.04 gebruiker.

Re: PyGTK programmeren
« Reactie #19 Gepost op: 2009/06/07, 19:48:06 »
Ja inderdaad :). Maar het zou dus niet werken met het voorbeeld hierboven.

Re: PyGTK programmeren
« Reactie #20 Gepost op: 2009/06/07, 21:19:21 »
Hij print in het voorbeeld "Button clicked", nu wil ik graag dat de label van dezelfde knop veranderd.
Hoe doe ik dan vanuit die andere class?
Volop Ubuntu 12.04 gebruiker.

Re: PyGTK programmeren
« Reactie #21 Gepost op: 2009/06/07, 21:30:52 »
Een gtk.Button heeft een set_label() functie. Aangezien ge met de callback ook de widget doorgeeft, kan het gewoon zo:
    def test_functie(self, widget):
        widget.set_label("Clicked!")