Hm ein absturz mit TKinter

Fragen zu Tkinter.
Antworten
joergo

Hallo forum,

ich habe hier grad einen mudclient, lyntin naemlich, und darin passiert folgendes:
es gibt eine class Tkui, darin zwei functions, settitle und colorcheck. Das sind beides ziemlich simple geschichten, settitle benutzt Tkinter.Tk.title, colorcheck benutzt Tkinter.Text.
ausserdem hat diese class Tkui eine __init__, die settitle aufruft, und ausserhalb der class gibt es eine function, die colorcheck aufruft.
soweit so gut, das __init__ klappt prima, die sache mit colorcheck auch. Bloss, sobald ich eine function schreibe die von aussen auf settitle zugreift, stuerzt das ganze ab.
Also ich glaube nicht das ich da was falsch mache, ich rufe settitle genauso auf wie auch colorcheck das colorcheck...
naja, hier ist das ganze mal in detail:


Code: Alles auswählen

class Tkui(ui.BaseUI):
  def __init__(self):
    self._tk = Tkinter.Tk()
    self.settitle()

    ...


  def settitle(self, title = ''):
    """
    Sets the title bar.

    @param title: the title to set
    @type  title: string
    """
    if title:
      self._tk.title(DEFAULTTITLE + title)
    else:
      self._tk.title(DEFAULTTITLE)

  def colorCheck(self):

    fgkeys = ['30','31','32','33','34','35','36','37']
    bgkeys = ['40','41','42','43','44','45','46','47']

    self._txt.insert('end', 'color check:\n')
    for bg in bgkeys:
      for fg in fgkeys:
        self._txt.insert('end', str(fg), (fg, bg))
        self._txt.insert('end', str("b" + fg), ("b" + fg, bg))
      self._txt.insert('end', '\n')

      for fg in fgkeys:
        self._txt.insert('end', str(fg), (fg, "b" + bg))
        self._txt.insert('end', str("b" + fg), ("b" + fg, "b" + bg))
      self._txt.insert('end', '\n')

    self._txt.insert('end', '\n')
    self._txt.insert('end', '\n')



Dann ausserhalb der class:

Code: Alles auswählen

def colorcheck_cmd(ses, args, input):
  """
  Prints out all the colors so you can verify that things are working
  properly.
  """
  myengine = exported.get_engine()
  myengine._ui_lock.acquire(1)
  try:
    myengine._ui.colorCheck()
  finally:
    myengine._ui_lock.release()
Und das funktioniert 1A.
Was abstuerzt ist folgendes:

Code: Alles auswählen

def settitle_cmd(ses, args, input):
  """
  crashes...
  """
  myengine = exported.get_engine()
  myengine._ui_lock.acquire(1)
  try:
    myengine._ui.settitle()
  finally:
    myengine._ui_lock.release()



Kann sich darauf jemand einen Reim machen? Woran koennte es liegen? Jemand sagte mir schon
das dasselbe unter Linux funktioniert (achja, bei mir laeuft das unter win XP, mit
python 2.2.2)

joergo
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi joergo,

versuchs mal so:

Code: Alles auswählen

  def settitle(self, title = ''):
    """
    Sets the title bar.

    @param title: the title to set
    @type  title: string
    """
    if title:
      self.thetitle = DEFAULTTITLE + title
      self._tk.title(self.thetitle)
    else:
      self._tk.title(DEFAULTTITLE)
Erklärung:

wenn Du self._tktile(DEFAULTTITLE + title) machst, macht Python aus DEFAULTTILTLE + title ein neues Stringobjekt, dieses ist aber nur für die Dauer des Funktionsaufrufs gültig und wird nach der Rückkehr aus der Funktion verworfen. So zeigt dann der Titel auf einen undefinierten Speicherbereich und es kommt zum Absturz. Durch das zwischenspeichern von DEFAULTTITLE + title in self.thetitle bleibt dieser auch nach dem Funktionsaufruf erhalten.

Gruß

Dookie
joergo

danke dookie, aber das hilft gradezu gar nix - ist immer noch genau dasselbe. Und ueberhaupt, ist das nicht wurscht ob das stringobject nach dem ende der function sonstwohin zeigt - schliesslich wird doch DEFAULTTITLE + title nur in der function selbst genau einmal benutzt?
Naja, jedenfalls klappts auch mit ner hilfsvariablen nicht.
Vielleicht hat ja einer lust sich das mal anzuschauen:
bei
http://sourceforge.net/project/showfile ... up_id=6730
gibts den kompletten client, und dann unter
http://lyntin.sourceforge.net/contents. ... tusbar.dat
ein script das genau das settitle auch benutzt, und wie gesagt so wie es ist unter linux funkt, unter winXP aber nicht.

joergo

PS das ist alles sehr easy zu installieren, einfach das zip von lyntin irgendwohin auspacken, dann das wbgstatusbar in lyntin's module-subdir, lyntin.py mit python starten, dann in lyntin #setstatus BOOM! tippen und ab gehts... :)
der dafuer relevante code steckt in lyntin\ui\tkui.py.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hmm, hab kein Win, aber wenns unter linux tut und unter xp nicht is es entweder ein bug in Tcl/Tk für XP oder direkt in XP.

Dookie
joergo

Ein Bug?
Hat jemand schonmal solche probleme mit tkinter und windows gehabt? Kann man da nix machen?
Also, frueher oder spaeter werd ich mir wohl eh linux geben, bloss hab ich halt jetzt erstmal mit python angefangen. Ausserdem ist doch unter windows alles so schoen bunt... :)
joergo
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

joergo hat geschrieben: Ausserdem ist doch unter windows alles so schoen bunt...
Wenn das ein Argument ist, dann muß ich sagen, dass mein Linux viel bunter und schöner ist :roll: Siehe http://python.normann-live.de/tmp/myScreen.png Und das ist nur einer von vier virtuellen Bildschirmen!

Hans
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

:wink: wir wollen besser mal kein Streit um Betriebssysteme vom Zaun brechen. beides aht schließlich vor- und nachteile. Linux ist gut im Datentransfer und Rechengeschwindigkeit, dafür gibts für win viel mehr spiele... :roll:
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

weiß ned ob das jetzt hier passt, aber wer lust hat linux mal auszuprobieren, kann ja von http://www.knoppix.de sich die Knoppix-CD runterladen und es ausprobieren, da is sogar python dabei.


Gruß

Dookie
Antworten