2016-05-20 1 views
1

Я пытаюсь создать программу просмотра изображений с помощью tkinter, все работает отлично, за исключением: я хочу иметь список всех изображений в каталоге пользователь выбрал этот список, который должен отображаться на холсте с горизонтальной полосой прокрутки, прикрепленной к нему, и видел, что другие люди на этой странице имели одну и ту же проблему, и кто-то сказал использовать кадр, который работает, но когда я хочу использовать полосы прокрутки, я получаю следующее сообщение об ошибке:python error "неизвестный параметр" 1 ": должен быть moveto или прокрутка" tkinter canvas

Exception in Tkinter callback 
    Traceback (most recent call last): 
     File "/usr/lib/python3.4/tkinter/__init__.py", line 1536, in/ 
     __call__ 
     return self.func(*args) 
     File "/usr/lib/python3.4/tkinter/__init__.py", line 1549, in xview 
     res = self.tk.call(self._w, 'xview', *args) 
    _tkinter.TclError: unknown option "1": must be moveto or scroll 
    >>> 

я не могу сделать головы или хвост из-за этого, поэтому, пожалуйста, любая помощь apreciated, вот фактический код:

from tkinter import * 
    from PIL import Image,ImageTk 
    import os 
    import time 

    #next image 
    def Next(): 
     i += 1 
     global img,i 
     print(i) 

     display_images(data[i]) 


    #previous image 
    def Previous(): 
     i -= 1 
     global img,i 
     print(i) 

     display_images(data[i]) 
    #list of images on canvas 
    def show_images(): 
     global photoButtons,imgFile,imOpen,imgFoto,resized,photolist 
     j = 0 
     for number in data: 
      print(">>>",number) 
      imOpen.append(Image.open(data[j])) 
      imgFile.append(imOpen[j]) 
      resized.append(imgFile[j].resize((50,50),Image.ANTIALIAS)) 
      imgFoto.append(ImageTk.PhotoImage(resized[j])) 
      photoButtons.append(Button(photolist, text=j,/ 
      image=imgFoto[j],command=display_images(data[j]),width=50,/ 
      height = 50)) 
      photoButtons[j].pack(side=RIGHT) 
      j += 1  

    #display selected image 
    def display_images(image_name): 
     img = Image.open(image_name) 
     size = img.resize((700,500),Image.ANTIALIAS) 
     photoviewer.image = ImageTk.PhotoImage(size) 
     photoviewer.create_image(0,0, image=photoviewer.image,anchor='nw') 

    # END DEF's 

    global i 

    i=0 
    #root 
    root = Tk() 

    #root size 
    root.geometry("1000x720+0+0") 
    #canvas for displaying image 
    photoviewer = Canvas(root, width=700, height=500) 
    photoviewer.grid(row = 0, column = 0) 
    photoviewer.place(x=295, y=215,) 
    #frame (ive got this from another page of stack overflow) 
    frame=Frame(root,width=300,height=300) 
    frame.grid(row=0,column=0) 
    #canvas for displaying list of images 
    photolist = Canvas(frame, width=395, height=50) 
    #scrollbar 
    scrl=Scrollbar(frame,orient=HORIZONTAL) 
    scrl.pack(side=BOTTOM,fill=X) 
    scrl.config(command=photolist.xview) 
    photolist.pack(side=TOP) 

    imgFile = [] 
    imOpen=[] 
    imgFoto=[] 
    resized = [] 
    #get the directory with the images from the user 
    data = os.listdir() 
    print(data) 
    cd = input("change directory to: ") 

    while cd != "x": 


     os.chdir(cd) 
     data = os.listdir() 
     print(data) 
     cd = input("change directory to: ") 

    #end 

    #creating button for next image 
    nxt=Button(root,text=">",command= Next) 
    #creating button for previous image 
    prvs=Button(root,text="<",command= Previous) 
    photoButtons = [] 
    show_images() 

    root.mainloop() 

Идея состоит в том, что пользователь должен выбрать каталог, после того как он нажал «x», программа должна вызвать show_images, которая должна отображать все изображения в этом каталоге на холсте с прикрепленной к нему полосой прокрутки, тогда пользователь должен уметь выбирать между ними, а также выбирать следующий и предыдущий, однако прокрутка не работает, любая помощь с этим будет оценена! благодаря!

+0

Возможно, вам понадобится 'photolist.config (xscrollcommand = scrl.set)'. По крайней мере, некоторые примеры, которые я нашел, имеют такую ​​линию. –

+0

ваш код имеет синтаксические ошибки (строки, заканчивающиеся на '/') –

ответ

0

Для подключения скроллбар к виджету вы должны сделать две вещи: сказать виджет, который ScrollBar взаимодействовать с (через xscrollcommand и/или yscrollcommand), и сказать скроллбар который виджет для прокрутки (с атрибутом command Вы. . пренебрегая сделать первую часть

Добавьте следующее где-то после создания скроллбара:

photolist.configure(xscrollcommand=scrl.set) 

Примечания: вам не нужно идти на проблемы встраивания кадра в холсте, если все, что вы хотите сделать это, прокрутить некоторые изображения. Вы можете напрямую создавать изображения на ca nvas. Преимущество, которое дает вам рамка, - вы можете использовать pack, поэтому вам не нужно вычислять координаты места размещения изображения, но это добавляет много сложности. Поскольку вы размещаете изображения бок о бок, легко вычислить координаты x/y для каждого изображения.

+0

the/is, когда линия слишком длинная, ее для новой строки –

+0

спасибо, ваш ответ сделал это, извините за то, что вы так долго до повторного воспроизведения, мой компилятор сломал: - ( –

+0

@ Cid-EL: '/' является незаконным синтаксисом. Собственный символ '\\' –