Anfängerfragen

Fragen zu Tkinter.
Benutzeravatar
DeKugelschieber
User
Beiträge: 82
Registriert: Sonntag 28. Februar 2010, 12:23
Kontaktdaten:

Edit: @wuf ja das merk ich schon, man muss schon einige Befehle usw kennen um das umzusetzen was man will^^

So, vielen Dank bis hierhin für eure Hilfe :)

Hier der Code: http://paste.pocoo.org/show/184719/

Noch 2 offene Fragen:

1. Kann man ein Icon vor einen Listeneintrag in einer Listbox setzen oder zumindest den Text färben (immer nur einen Eintrag, nicht den ganzen Text).

2. Kann man diesen "------------------" Menüpunkt in Menu() löschen? Sieht ziemlich hässlich aus.

Hier noch ein Screen:

Bild
MfG DeKugelschieber
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo DeKugelschieber

Den Menupunkt '-------------' kannst du mit:

Code: Alles auswählen

        # Dateimenu
        file_menu = Menu(menu, tearoff=False)
löschen

Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

..... Hier noch eine Listbox mit Icons (Slogan: Do it yourself)

Code: Alles auswählen

import Tkinter as tk

TRUE_ICON =\
"""
R0lGODlhGAAYAPf/ACd5Jyd9Jyh6KCh+KCiBKCiFKCiJKCmNKSmRKSmVKS6R
LiqZKiqdKi2aLS6cLjmOOTGfMSqhKiulKyuqKyutKyypLCytLCyxLCy1LCy5
LDSkNDGqMTqwOj2wPUGSQUSSREeZR0+RT0+VT1CSUFCWUFCZUFCdUEejR0K1
QkS0RES5RFChUFGlUVGpUVKtUlatVl6oXlKyUlK1UlK5UlK9Umu+a3CmcHKu
cnKwcnG2cX21fX67fn28fVPBU1PFU1TDVFTGVGjEaGzCbHPEc3PRc4S7hIfG
h4fJh4TOhInAiY7EjojNiIbQhpLDkpLEkpHQkZrVmp7TnqDKoKbPpqPQo6LZ
oqPco6XZpavRq63Tra/Ur7bitsDcwMXkxdTm1Nbq1tbs1trs2t/u39vw29/x
3+rz6u727vL58vX69fr8+v7+/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD/ACH5BAEKAP8ALAAAAAAYABgAAAj/AIkAGUhwYA8g
PRIq7EGjIY0YQ4BkmEix4sQLGC9U0FihgoQYEi1WzIjxypYOHiV8DCmSJMYU
atQcUakSpMgMLjsyiflE5QIJLXpYdMlxA5mYQST8XNAi5AWcJDt2vBJTDQSl
C5gKfZqz4waqMaFkzZogKFeMUjsGCVO1C4SxCRKw6JFRRZAgKTpcOVpVDRo0
asycSHBgLkYagP1C6cs4Zo4DhWlg3FkVDOMwVDJTUUL4gAkaOvtabtxXiQHP
oCscEU26L5cCBT6rXF25bxgtuLVMmeLhQOwYHpGwbo0FNmwSMZQKr93aC+wB
A5CrVDJcTRgnToro0OHheQERMbLSWo7ppXGZBwMKQAcAAHzWFqVJf1BfAAD0
EC0WxGWxYweLAzDkcMOAN5ig3noDtNdCXIR15ptxz7EnIXv4xQXZhRAeiOCE
IeTAwocsmCDiiCSUKIKJJYZQog0BAQA7"""

FALSE_ICON =\
"""
R0lGODlhGAAYAPf/AI0uLpEuLpUuLpkuLp0vL50xMZ40NJg8PJ04OKEvL6Uv
L6kvL6wvL6EwMKE2NqUwMKY1NakwMK0wMLEwMLUwMLkwML0wMKFFRalLS6FV
VaVVValVVa1VVbdCQrVNTb9AQLtJSb1ISLFWVrRWVrlWVr1WVrVtbbN1db51
dcExMcUxMckxMc0xMdAxMcVLS8JWVsZVVcpWVs1XV81aWtFXV9VXV9JYWNZY
WNhXV9hYWNlcXMJvb8pubsR2dthlZdJ2dtJ+ftd4eNl4eNx4eOB3d+F/f8OG
hsKLi8yNjceTk86SktaFhdqJid2Li9Gfn9uSktySktudndClpdalpdmhodul
pdylpdqpqdypqd+urtm4uOGLi+OTk+Cvr+KxseTCwuXGxu/V1fDW1vTW1vLY
2PDc3PTY2PTc3PHg4PTg4Pfu7vjr6/nz8/r19fz29v36+v7+/gAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD/ACH5BAEKAP8ALAAAAAAYABgAAAj/AIngGEiwIA0c
NBImjEEjhsMfOVpInDhxRYsVGFWoqLCxgscYESlWxJhR48aOFV7gmJijSBEa
K3wMmQlESAyUHie8CJkDjk84XH4KDdFxglESIbcIDSPU55oPFYxKJYHDotKf
TH2WgQJlCRAgIaRGQHrxqtamS8WOsIHRLJysaOFkWbAgQoQRMFe4LSMUjZe/
WLBMAaFAwVoVK5gsjSsUjIIIHGhsVPyTL2OfSBQQGHFTBWWfcLUGDqykQAEC
HG5WiMHGJxsql33uOJ3aY4UQPHiA6DAFTdPWcNRgICCAwwvbUo0+3uHbJxjT
pwUUjzEhavLHdiNI+emEuHQBGl4kdjcaAXsEAgWm+GyD4HsADSSk0i1cmIB9
9M1NCAjAP4P4CXZhp0AB591nhE9J8NdffAsA+Nhp93l3gU9HBADAhRmQsAB9
mmlmnwDeCSCFFgdYiCEJ5UVQgIcffiedghZamEEPI9Q4Agc45qgBBxr06KMG
GfR4QkAAOw==
"""

app_win = tk.Tk()

class ListItem(tk.Label):

    TEXT_PADX = 6
    COMPOUND = 'left'

    def __init__(self, parent, item_name, callback, **keys):

        self.true_icon = tk.PhotoImage(data=TRUE_ICON)
        self.false_icon = tk.PhotoImage(data=FALSE_ICON)
        self.prev_label_bg = None

        tk.Label.__init__(self, parent, **keys)
        self.config(image=self.false_icon, text=item_name,
            compound=self.COMPOUND,  padx=self.TEXT_PADX)
        self.pack(fill='x',padx=2)

        self.bind('<Enter>', self.mouse_enter)
        self.bind('<Leave>', self.mouse_leave)
        self.bind('<Button-1>', callback)

    def mouse_enter(self, event):
        print 'Enter'
        self.prev_label_bg = event.widget.cget('bg')
        event.widget.config(bg='gray')

    def mouse_leave(self, event):
        print 'Leave'
        event.widget.config(bg=self.prev_label_bg)

    def update_icon(self, status=False):
        print 'Icon Update'
        if status:
            self.config(image=self.true_icon)
        else:
            self.config(image=self.false_icon)

class MyListBox(tk.Frame):

    def __init__(self, parent, list_items):
        tk.Frame.__init__(self, parent)

        self.list_item_obj = [ListItem
            (self, item_name, self.callback)
            for item_name in list_items]

    def __getitem__(self, list_item_index):

        return self.list_item_obj[list_item_index]

    def __setitem__(self, list_item_obj, value=None):

        self.list_item_obj[list_item_obj] # = value

    def callback(self, event):
        print event.widget.cget('text')

list_items = ['Question-1',
              'Question-2',
              'Question-3',
              'Question-4',
              'Question-5',
              'Question-6',
              ]

list_box = MyListBox(app_win, list_items)
list_box.pack()

list_box[1].update_icon(True)
list_box[4].update_icon(True)

app_win.mainloop()
Das Snippet ist nur ein Prototyp!

Gruss wuf :wink:
Zuletzt geändert von wuf am Dienstag 2. März 2010, 18:42, insgesamt 1-mal geändert.
Take it easy Mates!
Benutzeravatar
DeKugelschieber
User
Beiträge: 82
Registriert: Sonntag 28. Februar 2010, 12:23
Kontaktdaten:

Vielen Dank :)
Wenn ich deinen Code soweit richtig verstanden habe:

Du baust im prinzip nur Labels mit einer Grafik und dem Text (hier rechts neben der Grafik) untereinander auf und fügst Bindungen hinzu.

Klasse Idee, ich versuch das mal (zu Übungszwecken) selber umzusetzen, wenn ich nicht mehr weiterkomme guck ich in deinen Code :D
MfG DeKugelschieber
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

...... Stimmt! Übersteigt die Anzahl der Labels (Listbox-Einträge) deine gewünschte Listboxhöhe kannst du natürlich noch automatisch Ziehleisten-Objekte einblenden. Das überlasse ich dir als Übung.

Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
DeKugelschieber
User
Beiträge: 82
Registriert: Sonntag 28. Februar 2010, 12:23
Kontaktdaten:

"Ziehlleistenobjekte" also scrollbars? Ich würde das ganze jetzt in ein label oder noch besser frame packen und eine scrollbar dranhauen.
MfG DeKugelschieber
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

...... Richtig! Ziehleisten = Scrollbars und als Behälter würde ich Frames verwenden.

Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
DeKugelschieber
User
Beiträge: 82
Registriert: Sonntag 28. Februar 2010, 12:23
Kontaktdaten:

Gut, ich schreib jetzt erstmal die Speicherfunktionen zu ende

Jetzt mit Speicherfunktion: http://paste.pocoo.org/show/184830/

Gibt es eine Möglichkeit Python 3.1 in eine exe umzuwandeln oder muss ich da noch warten?

EDIT: So siehts jetzt übrigens aus:

Bild
MfG DeKugelschieber
OpenCV
User
Beiträge: 20
Registriert: Mittwoch 17. Februar 2010, 15:29

Hallo!

Ich hätte auch ein paar Fragen:

1)Wie lautet das Command-Argument eines Buttons, dessen Funktion in einer anderen Klasse in einem anderen Package ist?

2)Wie kann ich ein eigenes Favicon einbinden?

MFG
Benutzeravatar
DeKugelschieber
User
Beiträge: 82
Registriert: Sonntag 28. Februar 2010, 12:23
Kontaktdaten:

1) check ich nicht^^

2)

Code: Alles auswählen

self.window.iconbitmap(default = 'graphics/icon.ico')		 	# Fenstericon
MfG DeKugelschieber
OpenCV
User
Beiträge: 20
Registriert: Mittwoch 17. Februar 2010, 15:29

@De Kugelschreiber
1)Also meine ich so was:

Button1 = Button(text="blabla", command = function1())

jedoch soll function1() nicht in der selben klasse liegen sondern in einer anderen, u.a. auch in einem anderen package...
BlackJack

@OpenCV: Ad 1) Du hast doch sicher schon einmal eine Funktion oder Methode aufgerufen die in einem Package, einem Modul, oder generell einem Objekt lag!? Genau so funktioniert das hier auch. Wo ist das Problem?

Wobei Du etwas unvorsichtig mit dem Wort Klasse umgehst, denn hier meinst Du sicher ein Exemplar. Es sei denn es ist eine Klassenmethode oder eine statische Methode.
Benutzeravatar
DeKugelschieber
User
Beiträge: 82
Registriert: Sonntag 28. Februar 2010, 12:23
Kontaktdaten:

jo deshalb verseh ich nicht ganz was er/sie will
MfG DeKugelschieber
Benutzeravatar
ts7343
User
Beiträge: 69
Registriert: Mittwoch 5. Mai 2010, 13:48

Hallo,

ich hab mal den Code soweit es geht runtergebrochen,
worum es mir geht ist, das widget: text_01 ausserhalb der init funktion
zu aendern, zum Beispiel um einen File zu laden oder den Text zu bearbeiten.

Was ich in vielen Tutorials finde ist halt das Standard-Beispiel mit der insert Funktion,
welches mir aber leider nicht so richtig hilft.

als Fehlermeldung bekomme ich zur Zeit:


Exception in Tkinter callback
Traceback (most recent call last):
File "/soft/python/2.6/lib/python2.6/lib-tk/Tkinter.py", line 1410, in __call__
return self.func(*args)
File "./class_01.py", line 10, in strip_file
self.text_01.insert(END,"test text")
AttributeError: my_application_class instance has no attribute 'text_01'



was fuer mich bedeutet, dass ich text_01 so nicht bearbeiten kann sondern
ueber irgendeine Zuweisung gehen muss?
self.text_01 = ....
aber wie setzt man das auf?

einige Varianten die alle nicht funktionieren:
self.master.text_01.insert(END,"test")
self.text_01 = self.master.insert(END,"test")

kann mir da jemand helfen, wie ich in der Funktion:
strip_file
das text widget manipulieren kann?






Code: Alles auswählen

#!/usr/bin/env python

from Tkinter import *

class my_application_class:    
            
   def strip_file(self, *args):
     self.text_01.insert(END,"test text")                      
   
   def __init__(self, master): 
#     frame_01 definition
      frame_01 = Frame(master)
      text_01  = Text(frame_01)
      text_01.pack()
      frame_01.pack()
#     frame_02 definition
      frame_02       = Frame(master)                       
      button_01      = Button(frame_02,command = self.strip_file)
      button_01.pack()
      frame_02.pack()


root = Tk()
display = my_application_class(root)
root.mainloop()
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Das `text_01` ist momentan lokal zur Funktion, danach ist es nicht mehr gebunden. Also binde es (in `__init__` !) genau so, wie du danach auch darauf zugreifen willst.

Darueber hinaus:
1) Bitte recycle keine Threads fuer andere Probleme.
2) Sternimporte, gerade bei grossen Paketen wie Tkinter sollte man vermeiden.
3) in Python 2.x sollte man von `object` erben.
4) Du solltest mal PEP8 lesen.
Benutzeravatar
ts7343
User
Beiträge: 69
Registriert: Mittwoch 5. Mai 2010, 13:48

Hallo cofi,

thanks for this fast answer!

kannst du mir eine Beispielzeile geben, wie ich es in __init__ auf die Art und Weise binde?
Wie meinst du das, "text_01" ist momentan lokal zu Funktion?

zu den anderen Punkten:
1) ich dachte, da der Thread: Anfaengerprobleme heisst, kann ich hier schreiben, wollte
mir nicht anmassen einen neuen Thread aufzumachen
2) meinst du mit Sternimport das *args in der Argumentliste ? Das hab ich nur aus lauter
Verzweiflung mit ruebergenommen um zu checken was dort ankommt.
3) kannst du das naeher erklaeren?
4) PEP8 muss ich mich erst informieren, was das ist, werd ich aber tun,

Vielen Dank im voraus
Benutzeravatar
ts7343
User
Beiträge: 69
Registriert: Mittwoch 5. Mai 2010, 13:48

Zum Thema "text_01" ist lokal zur Funktion ist mir noch eingefallen:

Wieso lokal zur Funktion, ich definiere doch in der init Funktion text_01
und diese sollte doch somit in allen anderen Methoden der Klasse
bekannt sein. Somit auch in strip_file(self) welche ja dazugehoert.

Vielen Dank
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Nein, `text_01` ist ein lokaler Name der Funktion `__init__`.

Wenn du den Namen in der Klassendefinition (ausserhalb der Methoden) bindest, hast du eine Klassenvariable, lokal zur Klasse und global fuer alle Instanzen.

Bindest du den Namen aber so `self.text_01 = tk.Frame(master)`, machst du sie zur Instanzvariable und andere Methoden koennen darauf zugreifen.

Ad 1) Doch, tu das ruhig, das Forum wird wohl nicht als Buch herauskommen, dass wir mit Platzproblemen zu tun haetten.
Ad 2) Nein, ich meine SternchenIMPORTE, d.h. `from Tkinter import *`, `import Tkinter as tk` ist ein recht haeufig benutztes Mittel um die Namen kurz zu halten.
Ad 3) Ja, aber das fuehrt hier ein wenig zu weit, die Stichworte sind `new-style classes` und `classic/old-style classes`. Im Forum oder in der Python-Dokumentation wird man dazu fuendig. Die Kurzform ist: Es schadet nichts von `object` zu erben, aber man bekommt Features frei Haus.
Ad 4) Siehe Signatur oder [pep]8[/pep]
Benutzeravatar
ts7343
User
Beiträge: 69
Registriert: Mittwoch 5. Mai 2010, 13:48

Hallo cofi,

vielen Dank fuer die Antwort, dass muss ich mir erst mal auf
der Zunge zergehen lassen, da ich noch nicht ganz fit bin bzgl.
der objektorientierten Fachtermini, wenn ich das mal so sagen darf.

das komische an der Sache ist halt auch, wenn ich in der
Funktion strip_file eine Zuweisung probiert habe, so etwas in der Art
wie:
self.text_01 = ""

dann hat er es geschluckt, es ist zwar nix passiert, aber es kam auch
keine Fehlermeldung. Nun dachte ich mir deshalb, er muss es irgendwie
kennen...

bzgl. deines letzten Postings werde ich mal etwas probieren und bei
Rueckfragen spontan einen neuen Thread aufmachen und unsere
bisherige History einfuegen, wenn das ok so ist,

bis spaeter
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

ts7343 hat geschrieben:das komische an der Sache ist halt auch, wenn ich in der
Funktion strip_file eine Zuweisung probiert habe, so etwas in der Art
wie:
self.text_01 = ""

dann hat er es geschluckt, es ist zwar nix passiert, aber es kam auch
keine Fehlermeldung. Nun dachte ich mir deshalb, er muss es irgendwie
kennen...
Nein, `self.text_01` muss nicht bekannt sein, damit die Zuweisung funktioniert, immerhin ueberschreibst du damit ja, was ggf. vorher dort war.
Antworten