Bonjour, je suis entrain de bricoler un logiciel.
J'ai un problème avec le comportement anormal d'un widget (ttk.Text) lorsqu'il est mappé dans le widget bricolé ScrollableFrame.
Lorsque l'on utilise l'ascenseur vertical de la frame, les widgets Text deviennent illisible, se couvrent de glitches.
Des idées ?

Je suis ennuyé car j'ai vraiment besoin d'un container scrollable pour d'autre widgets comportant un ttk.Text. Je ne vois pas d'autres possibilités pour mon application.

Ci dessous un code minimal qui reproduit le problème.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
 
import tkinter as tki
 
class wtk_VerticalScrolledFrame(tki.LabelFrame):
    def __init__(self, parent, titre, **kwargs):
 
        #couleurs optionnelles
        bgcolor = kwargs.get('background', None) 
 
        #mise en place
        tki.LabelFrame.__init__(self, parent, text=titre, **kwargs)
        self.vscrollbar = tki.Scrollbar(self, orient=tki.VERTICAL, **kwargs)
        self.vscrollbar.pack(fill=tki.Y, side= tki.RIGHT, expand = False)
        self.canvas = tki.Canvas(self, bd=0, highlightthickness=0, yscrollcommand=self.vscrollbar.set, **kwargs)
        self.canvas.pack(side=tki.LEFT, fill=tki.BOTH, expand= True)
        self.vscrollbar.config(command = self.canvas.yview)
 
        self.canvas.xview_moveto(0)
        self.canvas.yview_moveto(0)
 
        self.interior = tki.Frame(self.canvas)
        self.interior_id = self.canvas.create_window(0,0,window=self.interior, anchor=tki.NW)
 
        #bindings
        self.interior.bind('<Configure>', self._configure_interior)
        self.canvas.bind('<Configure>', self._configure_canvas)
 
 
    def _configure_interior(self, event):
        size = (self.interior.winfo_reqwidth(), self.interior.winfo_reqheight())
        self.canvas.config(scrollregion="0 0 %s %s" % size)
        if self.interior.winfo_reqwidth() != self.canvas.winfo_width():
                self.canvas.config(width= self.interior.winfo_reqwidth())
 
    def _configure_canvas(self, event):
        if self.interior.winfo_reqwidth() != self.canvas.winfo_width():
            self.canvas.itemconfigure(self.interior_id, width=self.canvas.winfo_width())
 
    def supprime_tout(self):
        for o in self.interior.winfo_children():
            o.destroy()
    def settitle(self, titre):
        self.configure(text = titre) 
 
class testapp_textframescrollable(tki.Frame):
    def __init__(self, parent):
        tki.Frame.__init__(self, parent)
        f = wtk_VerticalScrolledFrame(self, 'Textes')
        f.pack(expand = True, fill = tki.BOTH)
        self.pack(expand = True, fill = tki.BOTH)
 
        std = "Hello world \n ça va t'y ? \n tout va bien ? \n bonjour touloooouuuuussssseeee !!!!! \n Hihaaaaaaaaaaaaaaa"
 
        textes = []
        for i in range(10):
            textes.append(tki.Text(f.interior))
            textes[-1].configure(height = 5)
            textes[-1].insert(tki.END, std)
 
            textes[-1].pack(fill = tki.X)
 
if __name__ == '__main__':
 
    root = tki.Tk()
    app = testapp_textframescrollable(root)
    app.mainloop()