Anfängerfragen

Fragen zu Tkinter.
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.
Benutzeravatar
ts7343
User
Beiträge: 69
Registriert: Mittwoch 5. Mai 2010, 13:48

Hallo,

du schreibst:

self.text_01 = tk.Frame(master)

1)
benutzt du hierbei import Tkinter as tk ?

2)
woher weiss bei dieser Anweisung self.text_01 dass es ein textwidget ist?

3)
wo kommt diese Anweisung in die init function?

ich hoffe die Fragen sind nicht zu bloed.

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

Ad 1) Ja.
Ad 2) Das weiss das Objekt, nicht der Name (und schon gar nicht die Anweisung).

Code: Alles auswählen

#!/usr/bin/env python
import Tkinter as tk

class MyApplication(object):   
           
   def strip_file(self, *args):
     self.text_00.insert(END,"test text")                     
   
   def __init__(self, master):
      frame_01 = tk.Frame(master)
      self.text_01 = tk.Text(frame_01)
      text_01.pack()
      frame_01.pack()
      frame_02 = tk.Frame(master)                       
      button_01 = tk.Button(frame_02,command = self.strip_file)
      button_00.pack()
      frame_02.pack()


if __name__ == "__main__":
    root = tk.Tk()
    display = MyApplication(root)
    root.mainloop()
Benutzeravatar
ts7343
User
Beiträge: 69
Registriert: Mittwoch 5. Mai 2010, 13:48

Hallo cofi,

vielen Dank fuer deine Code, mit ein paar kleinen Aenderungen hat es
funktioniert, (vor beiden widgets, text und button jeweils ein self),

fuer mich hab ich das erst mal so abgespeichert, dass ich mit der
Definition:
self.text_01 = tk.Text(frame_01)
erst eine Methode definiere, und nur so kann ich ausserhalb auf
diese Methode zugreifen. Ist das so richtig formuliert?

Das mit dem tk gefaellt mir besser, ist irgendwie ordentlicher.

Ob man von object vererbt oder nicht, scheint hier nicht die Rolle
zu spielen, ist das syntaktisch richtiger oder warum macht man das?
class MyApp(object): vs. class MyApp():


Thanx!
Benutzeravatar
ts7343
User
Beiträge: 69
Registriert: Mittwoch 5. Mai 2010, 13:48

Hallo,

jetzt hab ich quasi ganz diszipliniert die neuen Richtlinien in meinen
original Code uebernommen, aber bekomme nun bei mehreren
Widgets Probleme in der Definition.
einige Beispiele waeren:
relief = RIDGE bei der frame definition
orient = VERTICAL bei einer scrollbar definition
selectmode = SINGLE bei einer listbox definition

das war davor alles kein Problem. Komischerweise vertraegt er
zum Beispiel die Eigenschaften: background, width und heigth
beim frame.

Weiterhin versteht er zum Beispiel das keyword: END nicht mehr,
welches ich bei:
self.text_01.insert(END,text_list)
verwende, jedoch "0.0" anstatt "END" funktioniert.

Nun bin ich etwas durcheinander, und es scheint mit dem import
zu tun haben:
import Tkinter as tk

Wie kann man das erklaeren und wie muss ich da reagieren,
dass er die keywords wieder erkennt?

Hier mal ein abgespecktes Beispiel, wo er stirbt bei:
frame_01 = tk.Frame(master, relief=RIDGE)

und wenn man das korrigiert stirbt er bei:
self.text_01.insert(END,text_list)



Code: Alles auswählen

#!/usr/bin/env python
import Tkinter as tk

class MyApplication(object):   
           
   def strip_file(self):
      text_list=[]
      text_list.append("line_01 \n")
      self.text_01.insert(END,text_list)                     
   
   def __init__(self, master):   
      frame_01 = tk.Frame(master, relief=RIDGE)      
      self.text_01 = tk.Text(frame_01)
      self.text_01.pack()
      frame_01.pack()      
      frame_02 = tk.Frame(master)                       
      self.button_01 = tk.Button(frame_02,command = self.strip_file)
      self.button_01.pack()
      frame_02.pack()

if __name__ == "__main__":
   root = tk.Tk()
   display = MyApplication(root)
   root.mainloop()
Benutzeravatar
ts7343
User
Beiträge: 69
Registriert: Mittwoch 5. Mai 2010, 13:48

I fixed it by myself,

for example:
frame_01 = tk.Frame(master, relief=RIDGE)

muss nun heissen:
frame_01 = tk.Frame(master, relief='ridge')

aber warum genau, das hab ich noch nicht verstanden ...
Antworten