Posts: 7
Threads: 3
Joined: Sep 2021
Oct-09-2021, 08:16 PM
(This post was last modified: Oct-10-2021, 08:18 AM by Yoriz.
Edit Reason: Added code tags
)
Using Canvas I get scrollbar in the right side of the form.
Is not possible put the scrollbar inside listbox ?
This is my relevant code
lb = Listbox(root, height=2, width=12, bg='white', fg='black', font=('times new roman', 10), exportselection=0)
canvas.create_window(505, 250, window=lb)
.......
scrollbar = Scrollbar(root)
scrollbar.pack(side="right", fill="y")
lb.config(yscrollcommand=scrollbar.set)
scrollbar.config(command=lb.yview)
Posts: 12,029
Threads: 485
Joined: Sep 2016
There was a set of demo programs written in 2005 (I have the original code, which I partially modified, for python 3.6). This included
a program cscroll.py (and support module template.py)
There's a much improved version for python 3 here: https://stackoverflow.com/a/43788752
If you'd like to see the original 2005 code, let me know, but the above link is a better version.
Posts: 7
Threads: 3
Joined: Sep 2021
Oct-10-2021, 11:31 PM
(This post was last modified: Oct-10-2021, 11:57 PM by Larz60+.
Edit Reason: changed tag from qoute to python
)
Thanks for reply
I followed the instructions and now I have the scrollbar at side of listbox.
However, the number of visible rows does not match with which i set for listbox height - i.e. I set height to 3 and get 5 visible rows
This is my relevant code
root = tk.Tk()
canvas = Canvas(root, width = 640, height = 430, relief = 'raised')
canvas.pack()
frame = Frame(canvas)
canvas.create_window(220, 270, window=frame)
lb = Listbox(frame, height=3, width=10, bg='white', fg='black', font=('times new roman', 9))
lb.insert(END, '1', '2', '3', '4', '5', '6', '7', '8')
lb.pack(side='left', fill='y')
scrollbar = Scrollbar(frame, orient = 'vertical', command=lb.yview)
scrollbar.pack(side="right", fill="y")
lb.config(yscrollcommand=scrollbar.set)
Posts: 12,029
Threads: 485
Joined: Sep 2016
modified your code so that it will run, and it shows the listbox in the frame, three high with the eight entries
unalligned, and not filling root.
from tkinter import *
root = Tk()
canvas = Canvas(root, width = 640, height = 430, relief = 'raised')
canvas.pack()
frame = Frame(canvas)
canvas.create_window(220, 270, window=frame)
lb = Listbox(frame, height=3, width=10, bg='white', fg='black', font=('times new roman', 9))
lb.insert(END, '1', '2', '3', '4', '5', '6', '7', '8')
lb.pack(side='left', fill='y')
scrollbar = Scrollbar(frame, orient = 'vertical', command=lb.yview)
scrollbar.pack(side="right", fill="y")
lb.config(yscrollcommand=scrollbar.set)
root.mainloop()
Posts: 7
Threads: 3
Joined: Sep 2021
Thanks again
But, if we set listbox height to 1 or 2, that does not modify the number of visible rows, which remains in 3.
Is this a normal procedure. i.e. there a minimal visible number of rows ?
Posts: 6,783
Threads: 20
Joined: Feb 2020
Where do you have room for a scrollbar if the height is less than 3? If you modify Larz60+ example to set the size to 1 and not expand the list to fill the frame you can see how silly this looks.
from tkinter import *
root = Tk()
canvas = Canvas(root, width = 640, height = 430, relief = 'raised')
canvas.pack()
frame = Frame(canvas)
canvas.create_window(220, 270, window=frame)
lb = Listbox(frame, height=1, width=10, bg='white', fg='black', font=('times new roman', 9))
lb.insert(END, '1', '2', '3', '4', '5', '6', '7', '8')
lb.pack(side='left')
scrollbar = Scrollbar(frame, orient = 'vertical', command=lb.yview)
scrollbar.pack(side="right", fill="y")
lb.config(yscrollcommand=scrollbar.set)
root.mainloop() Why would you use a listbox with size = 1 or 2? You can't see any of the list. To get listbox behavior with a small footprint use a combobox.
Posts: 7
Threads: 3
Joined: Sep 2021
I would like to save space because I want to use several listboxes - each one containing names of fields for searching a database with several criteria.
Anyway, the problem only occurs in Windows - in MacOs, I get the exact number of visible rows that I have set in listbox height
Thanks again
Posts: 6,783
Threads: 20
Joined: Feb 2020
For a small footprint use combobox. A combobox is like a listbox, but the list is displayed as a popup so it doesn't take up any screen space normally. It also has its own slider (if needed) so you don't have to write code for that.
https://www.pythontutorial.net/tkinter/t...-combobox/
|