scrollbar-canvas

Bonjour,
j’ai un problème de dimension du “curseur” (Thumb) de mes scrollbars.
elles remplissent la scrollbar et je ne peux qu’utiliser les flèches pour me déplacer H ou V. Voici mon code:

Frame1 = Frame(fen, background='white')
Frame1.place(x=20, y=y5, width=w1, height=h1)
Frame2 = Frame(Frame1, background='white')
Frame2.place(x=5,y=5, width=w1-10,height=h1-10)
cnvs = Canvas(Frame2, bg='white', width=w1-10, height=h1-10)
cnvs.place(x=0,y=0)
scrollable_frame = Frame(cnvs)
scrollable_frame.bind("<Configure>",lambda e: cnvs.configure(scrollregion=cnvs.bbox("all")))
cnvs.create_window((0, 0), window=scrollable_frame, anchor="nw")
scrollbarv = ttk.Scrollbar(Frame2, orient="vertical", command=cnvs.yview)
cnvs.configure(yscrollcommand=scrollbarv.set)
scrollbarv.pack(side="right", fill="y")
scrollbarh = ttk.Scrollbar(Frame2, orient="horizontal", command=cnvs.xview)
cnvs.configure(xscrollcommand=scrollbarh.set)
scrollbarh.pack(side="bottom", fill="x")
p=30
for n in range(1,300):
	cnvs.create_text(50, p, text=str(n)+' '+"Tkinter & azertyuiopqsdfghjklm",fill="black",font="Times 16 bold")
	p=p+30

J’y arrive avec une ListBox.
D’où pourrait venir mon erreur ?
Cordialement

Je ne suis pas pro en tk mais python - tkinter: binding mousewheel to scrollbar - Stack Overflow semble apporter une réponse, as-tu testé ?

Sur Linux cette version fonctionne, mais la scrollbar ne semble pas prendre en compte la hauteur du contenu, il doit manquer quelque chose :

from tkinter import *
from tkinter import ttk

fen = Tk()
y5 = 20
w1 = 100
h1 = 100

Frame1 = Frame(fen, background='white')
Frame1.place(x=20, y=y5, width=w1, height=h1)
Frame2 = Frame(Frame1, background='white')
Frame2.place(x=5,y=5, width=w1-10,height=h1-10)
cnvs = Canvas(Frame2, bg='white', width=w1-10, height=h1-10)
cnvs.place(x=0,y=0)
scrollable_frame = Frame(cnvs)
scrollable_frame.bind("<Configure>",lambda e: cnvs.configure(scrollregion=cnvs.bbox("all")))
cnvs.create_window((0, 0), window=scrollable_frame, anchor="nw")
scrollbarv = ttk.Scrollbar(Frame2, orient="vertical", command=cnvs.yview)
cnvs.configure(yscrollcommand=scrollbarv.set)
scrollbarv.pack(side="right", fill="y")
scrollbarh = ttk.Scrollbar(Frame2, orient="horizontal", command=cnvs.xview)
cnvs.configure(xscrollcommand=scrollbarh.set)
scrollbarh.pack(side="bottom", fill="x")
p=30
for n in range(1,300):
	cnvs.create_text(50, p, text=str(n)+' '+"Tkinter & azertyuiopqsdfghjklm",fill="black",font="Times 16 bold")
	p=p+30

cnvs.bind('<Button-4>', lambda e: cnvs.yview_scroll(int(-1*e.num), 'units'))
cnvs.bind('<Button-5>', lambda e: cnvs.yview_scroll(int(e.num), 'units'))

fen.mainloop()

Y a pas une appli de dessin de fenêtre graphique type wxFormBuiler pour tk? Histoire de voir la fenêtre en direct et de “simuler” le truc et changer des paramètres et poignés de redimentionnements jusqu’à ce que ce soit bon puis voir a quoi ressemble le code qui fait la même chose.

pour répondre à @mdk, il semble que j’ai un pb avec les dimensions, je regarde.
et pour répondre à @Musclor13, je ne connais pas wxFormBuiler…
mes connaissances sont très limitée par rapport à vous. :face_with_tongue:

J’ai effectivement trouvé que les dimensions influent sur la taille du curseur.
C’est résolu mais je privilégie la ListBox au Canvas.
Merci

Mes connaissances aussi sont assez limitée :smiley: .
En vrais je pense être pas mal en théorie ce qui m’a déjà permis d’aider un minimum des personnes qui utilisaient des apps (godot et le langage gdscript par exemple) que je ne connais que très peu.

et pour répondre à @Musclor13, je ne connais pas wxFormBuiler…

En gros même si c’est pas aussi bien que le code quand on connais a fond sa bibliothèque c’est une sorte de LibreOffice Draw mais pour dessiner ses fenêtres, onglets et boutons a la souris ainsi que changer les propriétés et ajouter des nom de fonction pour quand on appuis sur un bouton par ex. Ca te transforme le tout en class python (dans le cas de wx en tout cas) et t’a juste avec les fonctions qui vont bien et t’a juste a recreer tes fonctions toi-même en pure python (j’ai galéré sur ca de mon coté et j’ai encore du mal avec certains concepts).
En gros t’a pas besoin d’apprendre le code du dessin et des dimensions/propriétés mais tu doit quand même apprendre les signaux l’equivelent de get/set pour lire ou ecrire un texte dans un bouton/menu/label et d’autres trucs. Moi je fais énormément de trucs non graphiques donc ca va quand tu sait utiliser la console, qu’il y a un historique et que tu ne veut pas copier un fichier ailleurs en appliquant un filtre/effet ou une convertion car sinon tu doit taper/copier le chemain absolut dans l’interpreteur alors qu’une interface graphique permet de définir l’emplacement comme quand dans LibreOffice tu fait Fichier/Ouvrir par exemple.
Petites captures trouvés sur internet de ce que ca donne quand on sait utiliser mieux que moi :smiley:

Oui ce que j’ai trouvé sur internet c’est visiblement une personne asiatique qui dessine ses fenêtre mais l’appli est en anglais et pas trop dur a comprendre… Il en existe d’autre du même genre mais sait pas si il y en a pour wx…


QT

GTK

Je sais pas pour celui-la.

Essaie de chercher “Python Tkinter Designer” et t’aura peut-être des infos en plus mais perso j’ai testé plusieurs outils gratuits (qt ne l’est pas je crois) et j’ai préféré celui dont j’ai parlé mais il ne marche qu’avec wx et ses variantes (wxpython entre autre). Y a aussi wxglade mais j’aime moins (tjr images trouvés sur google)


Je fais pas les captures d’ecran moi-même car j’ai pas tellement d’applis de ce genre et concernant wxFormBuilder je ne fais rien de “pro” actuellement (une fenêtre, le premier canva qui me tombe sous la main pour agencer les widgets et un bouton :smiley: .

merci @Musclor13, je vais regarder ta proposition.

1 « J'aime »

Après moi je ne sais pas comment creer une fenêtre de A a Z sans ce genre d’appli. Je préfère y aller doucement et me contenter des signaux/get/set et une fois bien calé dessus me pancher sur le dessin de fenêtres proprement dit. Du coup le resultat est statique alors que toi avec ton code fait main tu peu faire redimensionner/bouger facilement un widget en fonction de la taille d’écran/fenêtre de l’utilisateur par exemple (genre si l’utilisateur mêt ta fenmetre en 100pixels de large et 800 de haut tu peu lui mettre un agencement d’appli smartphone (si ta bibli le permet contrairement a wx)..