Seite 4 von 4
text_01 as text widget
Verfasst: Mittwoch 5. Mai 2010, 20:58
von ts7343
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
Verfasst: Mittwoch 5. Mai 2010, 22:17
von cofi
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()
Verfasst: Donnerstag 6. Mai 2010, 09:29
von ts7343
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!
Verfasst: Donnerstag 6. Mai 2010, 09:55
von ts7343
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()
Verfasst: Donnerstag 6. Mai 2010, 10:46
von ts7343
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 ...
Verfasst: Donnerstag 6. Mai 2010, 10:51
von 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.
Verfasst: Freitag 7. Mai 2010, 21:30
von DeKugelschieber
Schön das mein Thread noch eine Verwendung findet

Verfasst: Freitag 7. Mai 2010, 22:35
von ts7343
ja, ich dachte der thread ist fuer allg. anfaengerfragen, also hab ich zugeschlagen, aber naechstes mal mach ich was eigenes auf,
Verfasst: Freitag 7. Mai 2010, 22:37
von ts7343
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
Verfasst: Freitag 7. Mai 2010, 22:52
von 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.
Verfasst: Samstag 8. Mai 2010, 07:50
von ts7343
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
Verfasst: Samstag 8. Mai 2010, 07:56
von numerix
ts7343 hat geschrieben:aber mir geht doch zum Beispiel das Keyword RIDGE verloren,
Es geht nichts "verloren":
oder auch je nach Geschmack:
Verfasst: Samstag 8. Mai 2010, 09:15
von 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']