Seite 1 von 2

Re: grid, Fragen zu Layout

Verfasst: Freitag 23. November 2012, 13:18
von Nobuddy
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. :?

Re: grid, Fragen zu Layout

Verfasst: Freitag 23. November 2012, 15:19
von Nobuddy
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")

Re: grid, Fragen zu Layout

Verfasst: Freitag 23. November 2012, 15:31
von EyDu
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.

Re: grid, Fragen zu Layout

Verfasst: Freitag 23. November 2012, 16:12
von Nobuddy
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?

Re: grid, Fragen zu Layout

Verfasst: Freitag 23. November 2012, 16:31
von Nobuddy
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

Re: grid, Fragen zu Layout

Verfasst: Freitag 23. November 2012, 16:56
von wuf
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:

Re: grid, Fragen zu Layout

Verfasst: Freitag 23. November 2012, 17:02
von wuf
... 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:

Re: grid, Fragen zu Layout

Verfasst: Freitag 23. November 2012, 18:28
von Nobuddy
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