На основании превосходного ответа на этот вопрос: Показать большое изображение с помощью полосы прокрутки в Python
… Мне удалось создать кадр прокручиваемого изображения, используя этот код, в Windows,Python 3:
import tkinter
from PIL import ImageTk, Image
class ScrollableImage(tkinter.Canvas):
def __init__(self, master=None, **kw):
self.image = kw.pop('image', None)
super(ScrollableImage, self).__init__(master=master, **kw)
self['highlightthickness'] = 0
self.propagate(0) # wont let the scrollbars rule the size of Canvas
self.create_image(0,0, anchor='nw', image=self.image)
# Vertical and Horizontal scrollbars
self.v_scroll = tkinter.Scrollbar(self, orient='vertical', width=6)
self.h_scroll = tkinter.Scrollbar(self, orient='horizontal', width=6)
self.v_scroll.pack(side='right', fill='y')
self.h_scroll.pack(side='bottom', fill='x')
# Set the scrollbars to the canvas
self.config(xscrollcommand=self.h_scroll.set,
yscrollcommand=self.v_scroll.set)
# Set canvas view to the scrollbars
self.v_scroll.config(command=self.yview)
self.h_scroll.config(command=self.xview)
# Assign the region to be scrolled
self.config(scrollregion=self.bbox('all'))
self.focus_set()
self.bind_class(self, "<MouseWheel>", self.mouse_scroll)
def mouse_scroll(self, evt):
if evt.state == 0 :
# self.yview_scroll(-1*(evt.delta), 'units') # For MacOS
self.yview_scroll( int(-1*(evt.delta/120)) , 'units') # For windows
if evt.state == 1:
# self.xview_scroll(-1*(evt.delta), 'units') # For MacOS
self.xview_scroll( int(-1*(evt.delta/120)) , 'units') # For windows
Теперь я хотел бы добавить ряд флажков с номерами на основе заданного списка numbers
.Опция по умолчанию должна состоять в том, что проверяются все числа.Затем можно снять некоторые цифры, а затем, когда нажата нижняя часть, все проверенные числа должны быть сохранены в новом списке, например checked_numbers
.
Вот как это может выглядеть:

Это то, что я пробовал до сих пор:
root = tkinter.Tk()
# Creating the check-boxes using a loop
numbers = [3,16,18,22,45]
for ii in numbers:
var = tkinter.IntVar()
c = tkinter.Checkbutton(root, text=str(ii), variable=var)
c.pack()
# PhotoImage from tkinter only supports:- PGM, PPM, GIF, PNG format.
# To use more formats use PIL ImageTk.PhotoImage
img = tkinter.PhotoImage(file='PATH TO IMAGE')
show_image = ScrollableImage(root, image=img, width=400, height=600)
show_image.pack()
Вот как это выглядит:

Очевидно, что есть много недостатков и вещей, которые я не знаю, как реализовать:
- Как назначить новую переменную в каждом цикле?
- Как иметь все отмеченные поля в строке вместо столбца?
- Как сохранить, какая переменная была проверена?
- Как сохранить проверенные переменные как новыесписок, когда кнопка нажата?
Буду признателен за любую помощь!
РЕДАКТИРОВАТЬ:
Я попытался использовать хороший ответ @ncica, который отлично работает насвой собственный, и добавил прокручиваемое изображение ...
import tkinter as tk
from tkinter import *
root = tk.Tk()
def read_states():
arry = list(map(lambda var: var.get(), states)) # store which variable has been checked
checked = []
result=(zip(numbers,arry))
for item in result:
if item[1] == 1:
checked.append(item[0]) # store the checked variables in a new list "checked"
print ("Checked are:{}".format(checked))
states = []
numbers = [3,16,18,22,45]
for ii in numbers:
var = IntVar()
chk = Checkbutton(root, text=str(ii), variable=var) # assign a new variable in every loop
chk.grid(row=1,column =numbers.index(ii)) # all checked-boxes put in a row
states.append(var)
button = tk.Button(root, text='OK', command=read_states)
button.grid(row=1,column =len(numbers)+1)
# PhotoImage from tkinter only supports:- PGM, PPM, GIF, PNG format.
# To use more formats use PIL ImageTk.PhotoImage
img = tk.PhotoImage(file='IMAGE_FILE_PATH')
show_image = ScrollableImage(root, image=img, width=400, height=600)
show_image.pack()
root.mainloop()
... но я получаю следующую ошибку:
TclError Traceback (most recent call last)
<ipython-input-11-1556cebf9634> in <module>()
31
32 show_image = ScrollableImage(root, image=img, width=400, height=600)
---> 33 show_image.pack()
34
35
~\Anaconda3\lib\tkinter\__init__.py in pack_configure(self, cnf, **kw)
2138 self.tk.call(
2139 ('pack', 'configure', self._w)
-> 2140 + self._options(cnf, kw))
2141 pack = configure = config = pack_configure
2142 def pack_forget(self):
TclError: cannot use geometry manager pack inside . which already has slaves managed by grid
Это может быть решено с помощьюзамена строки show_image.pack()
на show_image.grid(row=2,column =1, columnspan=len(numbers)+1)