grid, Fragen zu Layout

Fragen zu Tkinter.
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Hmm, habe gerade festgestellt, daß meine X-Scrollbar zwar funktioniert, aber statt auf die horizontale Ausrichtung zu reagieren, reagiert es auf die Y-Scrollbar.
Dürfte nur noch eine Kleinigkeit sein, komme aber auch nach etlichen Versuchen nicht drauf. :?
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Wieder ein kleiner Schritt weiter.

Mein Fehler, für das synchrone Verhalten zwischen X- u. Y-Scrollbar, konnte ich lösen.
Y-Scrollbar funktioniert prima, die X-Scrollbar leider immer noch nicht.

Hier nochmals der Code-Ausschnitt, vielleicht fällt Euch was auf?

Code: Alles auswählen

    def set_scrolled_entries(self, parent, label_names, result, screeny):

        self.entry_vars = [tk.StringVar() for _ in label_names]
        self.entries = list()
 
        scroll_frame = tk.Frame(parent, bg='red')
        canvas = tk.Canvas(scroll_frame, highlightthickness=0)
        canvas.grid(row=0, column=1, sticky=tk.NSEW)
 
        xscroll = tk.Scrollbar(scroll_frame, orient=tk.HORIZONTAL,
            command=canvas.xview)
        xscroll.grid(row=1, column=1, sticky=tk.EW)
 
        yscroll = tk.Scrollbar(scroll_frame, orient=tk.VERTICAL,
            command=canvas.yview)
        yscroll.grid(row=0, column=2, sticky=tk.NS)
 
        canvas.config(xscrollcommand=xscroll.set)
        scroll_frame.grid_rowconfigure(1, weight=1)
 
        canvas.config(yscrollcommand=yscroll.set)
        scroll_frame.grid_rowconfigure(0, weight=1)

        self.canvas = canvas
        self.bind_scroll(xscroll, self.x_scroll)
        self.bind_scroll(yscroll, self.y_scroll)

        label_frame = tk.Frame(canvas)
        ENTRY_IPADX = 5 # Abstand zu Text in x
        ENTRY_IPADY = 2 # Abstand zu Text in y
        for i, (var, name) in enumerate(zip(self.entry_vars,
                self.label_names)):
            label_container = tk.Frame(label_frame,)
            label_container.grid(row=i, column=0, padx=10, pady=10,
                sticky=tk.NW)
            label = tk.Label(label_container, text=name,
                font=self.conf['font'])
            label.grid(ipady=5, sticky=tk.W)
            entry_container = tk.Frame(label_frame,relief='sunken',
                bd=1, bg=self.conf['entry_bg'])
            entry_container.grid(row=i, column=1)
            entry = tk.Entry(entry_container, textvariable=var, width=70,
                font=self.conf['font'], bg=self.conf['entry_bg'], bd=0,
                highlightthickness=0)
            entry.grid(row=0, column=0, padx=ENTRY_IPADX, pady=ENTRY_IPADY)
            try:
                var.set(''.join([row[i] for row in result]))
            except IndexError:
                var.set('IndexError')
            self.entries.append(var)

        canvas.create_window(0, 0, window=label_frame, anchor=tk.NW)
        canvas.update_idletasks()
        x, y, w, h = label_frame.bbox(tk.ALL)

        h_max = h
        if h > (self.screeny - 150):
            h_max = (self.screeny - 150)

        canvas.config(scrollregion=(x, y, w, h), width=w, height=h_max)

        return scroll_frame


    def check(self, event):
        self.controller.process(self.items)


    def run(self):
        self.root.mainloop()


    def bind_scroll(self, widget, mode):
        #~~ Windows
        widget.bind("<MouseWheel>", mode)
        #~~ Linux      
        widget.bind("<Button-4>", mode)
        widget.bind("<Button-5>", mode)


    def x_scroll(self, event):
        if event.num == 5 or event.delta < 0:
            self.canvas.xview_scroll(1, "unit")
        elif event.num == 4 or event.delta > 0:
            self.canvas.xview_scroll(-1, "unit")


    def y_scroll(self, event):
        if event.num == 5 or event.delta < 0:
            self.canvas.yview_scroll(1, "unit")
        elif event.num == 4 or event.delta > 0:
            self.canvas.yview_scroll(-1, "unit")
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Nobuddy hat geschrieben:Hier nochmals der Code-Ausschnitt, vielleicht fällt Euch was auf?
Ja. Du solltest erstmal den ganzen kopierten Code des vertikalen und des horizontalen Scrollbars zusammenführen.
Das Leben ist wie ein Tennisball.
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

EyDu hat geschrieben:
Nobuddy hat geschrieben:Hier nochmals der Code-Ausschnitt, vielleicht fällt Euch was auf?
Ja. Du solltest erstmal den ganzen kopierten Code des vertikalen und des horizontalen Scrollbars zusammenführen.
Ja ich weiß, 'das Leben ist wie ein Tennisball', aber wie die Scrollbars zusammen führen?
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Ich habe den Code für die X-Scrollbar weiter nach unten, unter die for-Schleife getan, da die X-Scrollbar nicht über label und entry gehen soll, sondern nur auf das entry-Feld.

Code: Alles auswählen

    def set_scrolled_entries(self, parent, label_names, result, screeny):

        self.entry_vars = [tk.StringVar() for _ in label_names]
        self.entries = list()
 
        scroll_frame = tk.Frame(parent, bg='red')
        canvas = tk.Canvas(scroll_frame, highlightthickness=0)
        canvas.grid(row=0, column=1, sticky=tk.NSEW)
 
        yscroll = tk.Scrollbar(scroll_frame, orient=tk.VERTICAL,
            command=canvas.yview)
        yscroll.grid(row=0, column=2, sticky=tk.NS)
 
        canvas.config(yscrollcommand=yscroll.set)
        scroll_frame.grid_rowconfigure(0, weight=1)

        self.canvas = canvas
        self.bind_scroll(yscroll, self.y_scroll)

        label_frame = tk.Frame(canvas)
        ENTRY_IPADX = 5 # Abstand zu Text in x
        ENTRY_IPADY = 2 # Abstand zu Text in y
        for i, (var, name) in enumerate(zip(self.entry_vars,
                self.label_names)):
            label_container = tk.Frame(label_frame,)
            label_container.grid(row=i, column=0, padx=10, pady=10,
                sticky=tk.NW)
            label = tk.Label(label_container, text=name,
                font=self.conf['font'])
            label.grid(ipady=5, sticky=tk.W)
            entry_container = tk.Frame(label_frame,relief='sunken',
                bd=1, bg=self.conf['entry_bg'])
            entry_container.grid(row=i, column=1)
            entry = tk.Entry(entry_container, textvariable=var, width=70,
                font=self.conf['font'], bg=self.conf['entry_bg'], bd=0,
                highlightthickness=0)
            entry.grid(row=0, column=0, padx=ENTRY_IPADX, pady=ENTRY_IPADY)
            try:
                var.set(''.join([row[i] for row in result]))
            except IndexError:
                var.set('IndexError')
            self.entries.append(var)
 
        xscroll = tk.Scrollbar(scroll_frame, orient=tk.HORIZONTAL,
            command=canvas.xview)
        xscroll.grid(row=1, column=1, sticky=tk.EW)
 
        canvas.config(xscrollcommand=xscroll.set)
        scroll_frame.grid_rowconfigure(1, weight=1)
        self.bind_scroll(xscroll, self.x_scroll)

        canvas.create_window(0, 0, window=label_frame, anchor=tk.NW)
        canvas.update_idletasks()
        x, y, w, h = label_frame.bbox(tk.ALL)

        h_max = h
        if h > (self.screeny - 150):
            h_max = (self.screeny - 150)

        canvas.config(scrollregion=(x, y, w, h), width=w, height=h_max)

        return scroll_frame
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Nobuddy

Hier etwas zum austesten:

Code: Alles auswählen

    def set_scrolled_entries(self, parent, label_names, result, screeny):

        self.entry_vars = [tk.StringVar() for _ in label_names]
        self.entries = list()
 
        scroll_frame = tk.Frame(parent, bg='red')
        
        canvas = tk.Canvas(scroll_frame, highlightthickness=0)
        canvas.grid(row=0, column=1, sticky=tk.NSEW)
 
        #xscroll = tk.Scrollbar(scroll_frame, orient=tk.HORIZONTAL,
            #command=canvas.xview)
        xscroll = tk.Scrollbar(scroll_frame, orient=tk.HORIZONTAL,
            command=self.horizontal_scroll)
        xscroll.grid(row=1, column=1, sticky=tk.EW)
        self.xscroll = xscroll
 
        yscroll = tk.Scrollbar(scroll_frame, orient=tk.VERTICAL,
            command=canvas.yview)
        yscroll.grid(row=0, column=2, sticky=tk.NS)
 
        canvas.config(xscrollcommand=xscroll.set)
        scroll_frame.grid_rowconfigure(1, weight=1)
 
        #canvas.config(yscrollcommand=xscroll.set)
        canvas.config(yscrollcommand=yscroll.set)
        scroll_frame.grid_rowconfigure(0, weight=1)

        self.canvas = canvas
        #self.bind_scroll(xscroll, self.x_scroll)
        #self.bind_scroll(xscroll, self.horizontal_scroll)
        self.bind_scroll(yscroll, self.y_scroll)

        label_frame = tk.Frame(canvas)
        ENTRY_IPADX = 5 # Abstand zu Text in x
        ENTRY_IPADY = 2 # Abstand zu Text in y
        for i, (var, name) in enumerate(zip(self.entry_vars,
                self.label_names)):
            label_container = tk.Frame(label_frame,)
            label_container.grid(row=i, column=0, padx=10, pady=10,
                sticky=tk.NW)
            label = tk.Label(label_container, text=name,
                font=self.conf['font'])
            label.grid(ipady=5, sticky=tk.W)
            entry_container = tk.Frame(label_frame,relief='sunken',
                bd=1, bg=self.conf['entry_bg'])
            entry_container.grid(row=i, column=1)
            entry = tk.Entry(entry_container, textvariable=var, width=70,
                font=self.conf['font'], bg=self.conf['entry_bg'], bd=0,
                highlightthickness=0)
            entry.grid(row=0, column=0, padx=ENTRY_IPADX, pady=ENTRY_IPADY)
            entry.bind("<FocusIn>", self.entry_focus_callback)
            
            try:
                var.set(''.join([row[i] for row in result]))
            except IndexError:
                var.set('IndexError')
            self.entries.append(var)

        canvas.create_window(0, 0, window=label_frame, anchor=tk.NW)
        canvas.update_idletasks()
        x, y, w, h = label_frame.bbox(tk.ALL)

        h_max = h
        if h > (self.screeny - 150):
            h_max = (self.screeny - 150)

        canvas.config(scrollregion=(x, y, w, h), width=w, height=h_max)

        return scroll_frame


    def check(self, event):
        self.controller.process(self.items)


    def run(self):
        self.root.mainloop()


    def bind_scroll(self, widget, mode):
        #~~ Windows
        widget.bind("<MouseWheel>", mode)
        #~~ Linux
        widget.bind("<Button-4>", mode)
        widget.bind("<Button-5>", mode)

    def entry_focus_callback(self, event):
        print('Focus')
        event.widget.config(xscrollcommand=self.xscroll.set)
        self.entry_focus_pointer = event.widget
        
    def horizontal_scroll(self, *args):
        scroll_mode, value = args[0], args[1]
        print(scroll_mode, value)
        
        if scroll_mode == "scroll":
            units = args[2]
            self.entry_focus_pointer.xview_scroll(value, units)
        elif scroll_mode == "moveto":
            self.entry_focus_pointer.xview_moveto(value)

    def x_scroll(self, event):
        if event.num == 5 or event.delta < 0:
            self.canvas.xview_scroll(1, "unit")
        elif event.num == 4 or event.delta > 0:
            self.canvas.xview_scroll(-1, "unit")

    def y_scroll(self, event):
        if event.num == 5 or event.delta < 0:
            self.canvas.yview_scroll(1, "unit")
        elif event.num == 4 or event.delta > 0:
            self.canvas.yview_scroll(-1, "unit")
Nobuddy hat geschrieben:Ich habe den Code für die X-Scrollbar weiter nach unten, unter die for-Schleife getan, da die X-Scrollbar nicht über label und entry gehen soll, sondern nur auf das entry-Feld.
Löst der obige Code noch nicht!

Gruß wuf :wink:
Take it easy Mates!
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

... Hier noch die Bedienungsanweisung:
Klicke aufs vierte Eingabefeld (mit dem überlangen Text. Schaue wie sich die horizontale Scrollbar ändert. Ziehe die Scrollbar nach links und rechts.

Gruß wuf :wink:
Take it easy Mates!
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Hallo wuf

Habe alles so übernommen, kann aber keine optische Änderung feststellen.
Y-Scrollbar funktioniert und X-Scrollbar nicht.

Hier mal ein Bild wie es vorher schon war und jetzt auch noch so ist.
http://s14.directupload.net/file/d/3083 ... ez_png.htm

Nachtrag:
Habe Deinen letzten Post zu spät gesehen.
Danke für den Hinweis, so funktioniert es! :wink:
http://s7.directupload.net/file/d/3083/7oaks875_png.htm

Die Handhabung ist so völlig in Ordnung, glaube da muß man nichts mehr dran herumschrauben. :wink:

Grüße Nobuddy
Antworten