grid, Fragen zu Layout

Fragen zu Tkinter.
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: 996
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