2016-05-20 5 views
1

Ich versuche, ein Bildanzeigeprogramm mit tkinter zu erstellen, alles funktioniert gut, außer: Ich möchte eine Liste aller Bilder im Verzeichnis haben Der Benutzer wählte, diese Liste sollte auf einer Leinwand, mit einer horizontalen Bildlaufleiste daran angebracht werden, ich sah andere Leute auf dieser Seite hatte irgendwie das gleiche Problem und jemand sagte, um einen Rahmen zu verwenden, das funktioniert, aber wenn ich will die Scrollbar, ich die folgende Fehlermeldung erhalten:Python-Fehler "unbekannte Option" 1 ": muss move to oder scroll" 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 
    >>> 

i aus, dass macht Kopf oder Schwanz kann nicht, also bitte, jede mögliche Hilfe apreciated, hier ist der eigentliche Code:

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() 

die Idee ist, dass der Benutzer ein Verzeichnis wählen sollte, nachdem er 'x' gedrückt hat, sollte das Programm show_images aufrufen, die alle Bilder in diesem Verzeichnis auf einer Zeichenfläche mit einer Bildlaufleiste anzeigen sollte, sollte der Benutzer dann in der Lage zu sein, zwischen ihnen auszuwählen, und wählen Sie auch nächste und vorherige, aber die Bildlaufleiste funktioniert nicht, jede Hilfe mit diesem würde geschätzt werden! Vielen Dank!

+0

Vielleicht brauchen Sie 'photolist.config (xscrollcommand = scrl.set)'. Zumindest einige Beispiele, die ich gefunden habe, haben diese Art von Linie. –

+0

Ihr Code hat Syntaxfehler (Zeilen enden in '/') –

Antwort

0

Um eine Scrollbar zu einem Widget verbinden Sie zwei Dinge tun müssen: das Widget sagen die Scrollbar mit (via xscrollcommand und/oder yscrollcommand) und erzählen die Scrollbar, die (mit dem command Attribut scrollen Widget zu interagieren Sie sind. . vernachlässigen den ersten Teil zu tun

die folgende irgendwo hinzufügen nach dem Scrollbar erstellen:

photolist.configure(xscrollcommand=scrl.set) 

Hinweis: Sie müssen nicht einen Rahmen einzubetten in die Leinwand die Mühe gehen, wenn alles, was Sie wollen zu tun ist einige Bilder scrollen.Sie können Bilder direkt auf der ca erstellen nvas. Der Vorteil, den der Rahmen Ihnen gibt, ist, dass Sie pack verwenden können, so dass Sie nicht die Koordinaten berechnen müssen, wo das Bild platziert werden soll, aber es fügt eine Menge Komplexität hinzu. Da Sie die Bilder nebeneinander platzieren, ist es einfach, die x/y-Koordinaten für jedes Bild zu berechnen.

+0

das/ist, wenn eine Zeile zu lang wird, ist es für eine neue Zeile –

+0

danke, Ihre Antwort hat es getan, Entschuldigung für so lange vor dem Abspielen, mein Computer bricht: - ( –

+0

@ Cid-EL: die '/' ist illegale Syntax. Das richtige Zeichen ist '\\' –