Scrollbar rührt sich nicht

Fragen zu Tkinter.
Dada
User
Beiträge: 8
Registriert: Samstag 21. Januar 2006, 18:07

Scrollbar rührt sich nicht

Beitragvon Dada » Freitag 10. März 2006, 09:13

Guten Tag,

ich habe mit dem „Scrollbar“ immer das Problem, dass er zwar dargestellt wird - sich jedoch nicht verschieben lässt.
System: Python 2.3.3., Tkinter 1.177, SuSE-Linux 9.1
Beispiel:

Code: Alles auswählen

#! /usr/bin/python
# -*- coding: utf-8 -*-
from Tkinter import *
Fenster_a = Tk()
Fenster = Text(Fenster_a)
Schiebebalken = Scrollbar(orient= u'vertical')
Schiebebalken.pack(expand= 1, side= u'right', fill= u'y')
Schiebebalken.configure(command= Fenster.yview)
Fenster ['yscrollcommand'] = Schiebebalken.set
for i in range(0, 50):
   Label(text= str(i) + u'Dies ist ein Text').pack()
Fenster.wait_window()

Kann mir bitte jemand helfen? Danke

Dada
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Beitragvon Mr_Snede » Freitag 10. März 2006, 11:02

hmm, was willst den denn im Ende machen?
Mich verwirrt(unabhängig vom Rollbalken), dass du Labels mit Text auf das Textfeld legst.
Das Textfeld selbst kann schon Text anzeigen.

Code: Alles auswählen

#! /usr/bin/python
# -*- coding: utf-8 -*-
from Tkinter import *
Haupt_Fenster = Tk()
Text_Feld = Text(Haupt_Fenster, width=40, height=6)
Text_Feld.pack()
for i in range(50):
   Text_Feld.insert(END, 'Dies ist ein Text\n')
Haupt_Fenster.mainloop()


Beispiele zum Rollbalken
Ein Textfeld mit horizontalen und vertikalen Rollbalken wurde schon mal besprochen.


PS: mit etwas Farbe (bg -> backgrund ) und Rahmen für die Widgets (hier Relief) erkennt man die einzelnen Widgets besser.

Code: Alles auswählen

#! /usr/bin/python
# -*- coding: utf-8 -*-
from Tkinter import *

Fenster_a = Tk()
Fenster_a.configure(bg="green")

Fenster = Text(Fenster_a)
Fenster.configure(bg="blue")
#Fenster.pack()

Schiebebalken = Scrollbar(orient= u'vertical')
Schiebebalken.pack(expand= 1, side= u'right', fill= u'y')
Schiebebalken.configure(command= Fenster.yview)
Fenster ['yscrollcommand'] = Schiebebalken.set
for i in range(0, 50):
    lbl = Label(text= str(i) + u'Dies ist ein Text')
    lbl.configure(relief=RAISED, bg="red")
    lbl.pack()
Fenster.wait_window()


Wie du siehst, fehlt da irgendo die Farbe blau.
Du hast vergessen, "Fenster" auch zu Packen.
Entferne das Kommentarzeichen vor:

Code: Alles auswählen

#Fenster.pack()


Und du siehst, was du gebastelt hast ;-)
Dada
User
Beiträge: 8
Registriert: Samstag 21. Januar 2006, 18:07

Beitragvon Dada » Freitag 10. März 2006, 20:34

Vielen Gank für die Mühe. Das ich Labels mit Text auf ein Textfeld legen will, hat einfach „historische“ Gründe: In meinem eigentlichen Programmen existieren manche normale Toplevel-Felder, auf denen so viele Label- und Entry-Felder positioniert sind, dass der Bildschirm nicht ausreicht. Daher bin ich auf die naheliegende Idee gekommen, an die Seite einen Schiebebalken zusetzen. Dumm nur, dass dieser nur für Text-, Canvas- und Listbox-Felder definiert ist. Deswegen habe ich in meinen Eingangstestbeispiel einfach ein Text-Feld als Zwischenebene eingezogen - Leider nicht mit dem gewünschten Erfolge.
Mit den Denkanstößen und Probieren, Suchen und Lesen habe ich jetzt das folgende, funktionsfähige Beispiel konstruiert. Ob es die eleganteste Möglichkeit ist, weiß ich nicht.

Code: Alles auswählen

#! /usr/bin/python
# -*- coding: utf-8 -*-
from Tkinter import *
Fenster_a = Tk()
Fenster = Canvas(Fenster_a, width= u'10c', height= u'15c')
Fenster.pack(side= u'left')
Schiebebalken = Scrollbar(Fenster_a, orient= u'vertical')
Schiebebalken.pack(side= u'right', fill= u'y')
Schiebebalken.configure(command= Fenster.yview)
Fenster ['yscrollcommand'] = Schiebebalken.set
for i in range(0, 50):
   Text = Label(Fenster, text= str(i) + u'Dies ist ein Text'); Text.pack()
#   Text = Entry()
   Fenster.create_window(0, i * 15, anchor= u'nw', window= Text)
   pass
Fenster.wait_window()

Dada
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Beitragvon Mr_Snede » Freitag 10. März 2006, 21:01

bin aufm Sprung(hab nur noch 45 Min Zeit Alk in mich reinzukippen, bevor es gleich auffe Piste geht) und wollte dich auf die folgenden 2 Widgets hinweisen (könnten arbeit vermeiden):

http://tix.sourceforge.net/dist/current ... Window.htm
-> Tix wird mit Python ausgeliefert, leider fast nur tcl Doku

http://pmw.sourceforge.net/doc/ScrolledFrame.html
verständliche(für mich) Doku, muss aber extra installiert werden oder da pure Python geschickt als Modul mit deinem Programm ausgeliefert werden.
gugsdu auch hier: http://www.python-forum.de/viewtopic.php?p=31575#31575
Dada
User
Beiträge: 8
Registriert: Samstag 21. Januar 2006, 18:07

Beitragvon Dada » Montag 13. März 2006, 11:25

Danke für die Tips. Ich habe mich jetzt entschieden, das Ganze mit Tix-ScrolledWindow zu realisieren. Es hat mich aber auch viel Zeit gekostet, da ich selbst im Internet keine venünftige Dokumentation über Tix habe finden können; habe einfach entnervend viel probieren müssen. Dafür lässt es sich leicht ins vorhandene Programm einbauen.
Eine Frage ist dabei offengeblieben: Ich brauche im nachfolgenden Beispiel die Methode "window" (Zeile 10) - aber warum?

Code: Alles auswählen

#! /usr/bin/python
# -*- coding: utf-8 -*-

from Tix import ScrolledWindow
from Tkinter import *

s = Tk(); s.withdraw()
t = Toplevel(s) # nicht unbedingt nötig
u = ScrolledWindow(t, width= u'10c', height= u'15c'); u.pack()
F = u.window
u.configure(width= u'10c', height= u'10c')
for i in range(50):
   Label(F, text= 'Schleife' + str(i)).pack()
Label(F, text= u'Text').pack(side= u'left')
Entry(F).pack()
u.wait_window()

Dada
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Beitragvon Mr_Snede » Montag 13. März 2006, 13:10

haha, da haben wir wohl am Wochenende das gleiche gemacht.

Mein minimales Beispiel für TixScrolledWindow sieht so aus:

Code: Alles auswählen

import Tix

blind_text = '''Lorem ipsum dolor sit amet'''

root = Tix.Tk()
win = Tix.ScrolledWindow(root, scrollbar='auto')
win.configure(width=100, height=120)
win.pack()

for i in xrange(10):
   lbl = Tix.Label(win.window, text=blind_text)
   lbl.pack(expand=1, fill=Tix.BOTH)

root.mainloop()


Aber wozu bei dir

Code: Alles auswählen

 F = u.window
gut ist weiß ich nicht (habe jetzt aber auch nicht nachgeforscht)

Allgemein:
Vermeide

Code: Alles auswählen

 from Tkinter import *
Wobei das nicht nur für Tkinter sondern alle Module gilt.

Wenn du Tix importierst, kannst du die normalen Widgets auch über Tix ansprechen, somit brauchst du nicht noch Tkinter importieren.
Ein Label zB einfach mit Tix.Label

Hast du noch weitere TixWidgets ausprobiert?
Ich habe noch die TixButtonbox und das TixNotebook im Angebot.
Die kommen bald bei den Codeschnipseln mit rein oder/und im Wiki (oder/und meiner eigenen Webseite)

Ganz dolle interessiert bin ich an den Listboxen speziell (Scrolled)TList.

Wenn du bock hast können wir uns ja mal durch ein paar TixWidgets kämpfen und ein bischen Python Doku und Beispiele produzieren.

cu Sebastian
Dada
User
Beiträge: 8
Registriert: Samstag 21. Januar 2006, 18:07

Beitragvon Dada » Montag 13. März 2006, 14:35

da haben wir wohl am Wochenende das gleiche gemacht.
Scheint so - aber doppelt genäht soll ja besser halten ...

Code: Alles auswählen

F = u.window
 Label(F, text= 'Schleife' + str(i)).pack()

in meinem Beispiel ist im Endeffekt dasselbe wie

Code: Alles auswählen

   lbl = Tix.Label(win.window, text=blind_text)
.
Meine Frage war auch nur nach dem semantischen Sinn der - notwendigen - Methode "window".
Das man "import *" vermeiden sollte, habe ich schon mehrmals gelesen; nur mir fehlt der Grund dazu, weshalb ich bisher dabei geblieben.
Bisher habe ich aus dem Tix-Modul nur das ScrolledWindow ausprobiert. Grundsätzlich hätte ich schon Interesse, meine Tix/Pythonkenntnisse zu vertiefen, aber das Programm bzw. die "interpersonalen Verhältnisse" in der Wettkampforganisation haben mich etwas zu viel Energie gekostet. Ich muss da jetzt ein bisschen vorsichtig sein und kürzer treten. Das Programm muss jedoch fertig werden.

Dada

p.s.: Eine ungelöste Frage fällt mir gerade
noch ein: Kann man in Python irgendwie die Auflösung des Bildschirmes abfragen, damit das ScrolledWindow-Fenster maximal gesetzt werden kann?
Oder das Problem anders geschildert: Wenn ich das Fenster auf dem Bildschirm mit der Maus größer ziehe, vergrößert sich nur mein Toplevel-Fenster (?), das ScrolledWindow-Fenster behält seine Ausgangsgröße.
Ich habe dieses letzte Problem inzwischen mit

Code: Alles auswählen

ScrolledWindow(...).pack(expand= 1, fill= u'both')
gelöst.
jAN
User
Beiträge: 170
Registriert: Samstag 4. Juni 2005, 18:51
Wohnort: Großmehlra (in Thüringen)
Kontaktdaten:

Beitragvon jAN » Freitag 24. März 2006, 07:35

ich hab da mal was aus nem anderen thread kopiert...


Hannes-Spz hat geschrieben:wie wärs mal mit

Code: Alles auswählen

Bildschrimbreite=root.winfo_screenwidth()
Bildschirmhoehe=root.winfo_screenheight()

allgemein musst du einfach in Tkinter (geöffnet mit alt+m)
nach "def winfo_" ohne die "s suchen und blätterst dann mit str+g durch alle ergebnisse durch.

das ganze hat dann einfach nur die folgende form:

Code: Alles auswählen

meine_variable = mein_widget.winfo_...(...)


(dass DU sowas nicht weißt... :D :D )
#adios.py
import os,sys
while 1: os.startfile(sys.argv[0])

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder