Anfängerfragen

Fragen zu Tkinter.
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 ...
BlackJack

@ts7343: Methoden werden innerhalb einer Klasse mit ``def`` definiert. Mit ``self.irgedwas = wert`` wird ein Attribut zugewiesen und gewissermassen definiert wenn es die erste Zuweisung an dieses Attribut ist.

Wenn Du nicht mehr all Namen aus dem `Tkinter`-Modul in den Namensraum des aktuellen Moduls holst, dann sind `END` & Co so natürlich nicht mehr bekannt, denn diese Namen sind ja aus dem `Tkinter`-Modul. Und über dieses, was in Deinem Modul an den Namen `tk` gebunden ist, musst Du diese Konstanten jetzt auch ansprechen. Genau wie die anderen Objekte wie zum Beispiel `Frame`.

Objekte die nicht in anderen Methoden benötigt werden, sollte man auch nicht an das Objekt binden. Das beträfe in Deinem Beispiel den Button. Und das durchnummerieren von Namen solltest Du Dir gar nicht erst angewöhnen. Namen sollten dem Leser eine Idee davon vermitteln was die Objekte, die dahinter stehen *bedeuten*. Unter `button_01` oder `text_01` kann man sich nicht viel vorstellen.

In der überwiegenden Zahl der Quelltexte die man so findet stehen die "magischen" Methoden, also die mit doppelten führenden Unterstrichen übrigens am Anfang einer Klasse.
Benutzeravatar
DeKugelschieber
User
Beiträge: 82
Registriert: Sonntag 28. Februar 2010, 12:23
Kontaktdaten:

Schön das mein Thread noch eine Verwendung findet :D
MfG DeKugelschieber
Benutzeravatar
ts7343
User
Beiträge: 69
Registriert: Mittwoch 5. Mai 2010, 13:48

ja, ich dachte der thread ist fuer allg. anfaengerfragen, also hab ich zugeschlagen, aber naechstes mal mach ich was eigenes auf,
Benutzeravatar
ts7343
User
Beiträge: 69
Registriert: Mittwoch 5. Mai 2010, 13:48

Hallo BlackJack,

hast du fuer mich noch ein command, wie ich herausfinde, welche
Namen mir alle verloren gehen, wenn ich schreibe:
import Tkinter as tk

anstatt von:
from Tkinter import *

gab es da nicht etwas mit dir() ?

thanks
lp
BlackJack

@ts7343: Wenn das Dein einziger *-Import war, dann schau doch einfach welche Namen etwas mit der GUI zu tun haben. Wo sollten die schon herkommen als aus dem `Tkinter`-Modul. Du solltest eigentlich bei eigenem Quelltext wissen wo Deine Namen herkommen.
Benutzeravatar
ts7343
User
Beiträge: 69
Registriert: Mittwoch 5. Mai 2010, 13:48

Hallo BlackJack,

aber mir geht doch zum Beispiel das Keyword RIDGE verloren,
obwohl es auch etwas mit Tkinter zu tun hat,
er nimmt ja dann z.b. nicht mehr:
frame_01 = tk.Frame(master, relief=RIDGE)

somit gehen mir gewisse Namen mit:
import Tkinter as tk
verloren, und welche Namen haette ich gerne gewusst, denn
meiner Meinung nach haben Namen wir RIDGE (oder END fuer text.insert)
auch etwas mit Tkinter zu tun?

thanx
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

ts7343 hat geschrieben:aber mir geht doch zum Beispiel das Keyword RIDGE verloren,
Es geht nichts "verloren":

Code: Alles auswählen

frame_01 = tk.Frame(master, relief=tk.RIDGE)
oder auch je nach Geschmack:

Code: Alles auswählen

frame_01 = tk.Frame(master, relief="ridge")
BlackJack

@ts7343: `RIDGE` ist übrigens kein Schlüsselwort sondern einfach ein Name wie jeder andere. Der hat keine besondere Bedeutung für Python. Als Schlüsselwörter bezeichnet man die Worte die zur Syntax einer Programmiersprache gehören.

Code: Alles auswählen

In [454]: import keyword

In [455]: keyword.iskeyword('RIDGE')
Out[455]: False

In [456]: keyword.iskeyword('for')
Out[456]: True

In [457]: keyword.iskeyword('import')
Out[457]: True

In [458]: keyword.kwlist
Out[458]:
['and',
 'as',
 'assert',
 'break',
 'class',
 'continue',
 'def',
 'del',
 'elif',
 'else',
 'except',
 'exec',
 'finally',
 'for',
 'from',
 'global',
 'if',
 'import',
 'in',
 'is',
 'lambda',
 'not',
 'or',
 'pass',
 'print',
 'raise',
 'return',
 'try',
 'while',
 'with',
 'yield']
Zuletzt geändert von BlackJack am Montag 10. Mai 2010, 07:23, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Tags gesetzt.
Antworten