Hinzufügen einer Bildlaufleiste, um einen Rahmen mit Tkinter (Python)
Habe ich ein einfaches GUI, das ist zeigt die Benutzer einige Optionen, nachdem man die Nummer der ersten Optionen angezeigt werden. In diesem Fall, 4:
Indem Sie auf Add row
Sie können fügen Sie eine Zeile hinzu, um die GUI. Die Sache ist, dass, wenn der Benutzer möchte 100 Möglichkeiten, die GUI wird extra groß und alle Optionen werden nicht angezeigt.
Also ich würde gerne eine scrollbar nur auf die Optionen im Raum, der rest nicht teilen. Sorry für die schlechte Photoshop, aber ich hätte gerne so etwas wie dieses:
Optionen Raum ist die FrameTwo
, so würde ich mag, um die gesamte FrameTwo
innerhalb der Bildlaufleiste, wie im Bild oben.
# -*- coding: utf-8 -*-
from Tkinter import *
import Image
import ImageTk
import tkFileDialog
import datetime
class Planificador(Frame):
def __init__(self,master):
Frame.__init__(self, master)
self.master = master
self.initUI()
def initUI(self):
self.master.title("Plan")
self.frameOne = Frame(self.master)
self.frameOne.grid(row=0,column=0)
self.frameTwo = Frame(self.master)
self.frameTwo.grid(row=1, column=0)
self.frameThree = Frame(self.master)
self.frameThree.grid(row=2, column=0)
# Borrar esto?
self.txt = Text(self)
self.txt.pack(fill=BOTH, expand=1)
self.piezastext = Label(self.frameOne, text = " Amount of pieces ", justify="center")
self.piezastext.grid(row=1, column=0)
self.entrypiezas = Entry(self.frameOne,width=3)
self.entrypiezas.grid(row=2, column=0, pady=(5,5))
self.aceptarnumpiezas = Button(self.frameOne,text="Click me", command=self.aceptar_piezas,width=8)
self.aceptarnumpiezas.grid(row=6, column=0, pady=(5,5))
def aceptar_piezas(self):
try:
val = int(self.entrypiezas.get())
self.aceptar_piezas_ok()
except ValueError:
showerror('Error', "Introduce un numero")
def aceptar_piezas_ok(self):
self.num_piezas = self.entrypiezas.get()
self.piezastext.grid_remove()
self.entrypiezas.grid_remove()
self.aceptarnumpiezas.grid_remove()
self.optionmenus_piezas = list()
self.numpiezas = []
self.numerolotes = []
self.optionmenus_prioridad = list()
self.lotes = list()
self.mispiezas = ['One', 'Two', 'Three', 'Four', 'Five']
self.n = 1
while self.n <= int(self.num_piezas):
self.textopieza = Label(self.frameTwo, text = "Pieza: ", justify="left")
self.textopieza.grid(row=self.n, column=0)
var = StringVar()
menu = OptionMenu(self.frameTwo, var, *self.mispiezas)
menu.config(width=10)
menu.grid(row=self.n, column=1)
var.set("One")
self.optionmenus_piezas.append((menu, var))
self.numpiezastext = Label(self.frameTwo, text = "Numero de piezas: ", justify="center")
self.numpiezastext.grid(row=self.n, column=2, padx=(10,0))
self.entrynumpiezas = Entry(self.frameTwo,width=6)
self.entrynumpiezas.grid(row=self.n, column=3, padx=(0,10))
self.entrynumpiezas.insert(0, "0")
self.textoprioridad = Label(self.frameTwo, text = "Prioridad: ", justify="center")
self.textoprioridad.grid(row=self.n, column=4)
var2 = StringVar()
menu2 = OptionMenu(self.frameTwo, var2, "Normal", "Baja", "Primera pieza", "Esta semana")
menu2.config(width=10)
menu2.grid(row=self.n, column=5)
var2.set("Normal")
self.optionmenus_prioridad.append((menu2, var2))
self.lotestext = Label(self.frameTwo, text = "Por lotes?", justify="center")
self.lotestext.grid(row=self.n, column=6, padx=(10,0))
self.var1 = IntVar()
self.entrynumlotes = Checkbutton(self.frameTwo, variable=self.var1)
self.entrynumlotes.grid(row=self.n, column=7, padx=(5,10))
self.lotes.append(self.var1)
self.numpiezas.append(self.entrynumpiezas)
self.n += 1
self.anadirpiezas = Button(self.frameThree, text="Add row", command=self.addpieza, width=10)
self.anadirpiezas.grid(row=0, column=2, pady=(10,10))
self.calculotext = Label(self.frameThree, text = "Other stuff ")
self.calculotext.grid(row=1, column=2, padx=(10,0), pady=(10,10))
self.graspbutton = Button(self.frameThree, text="OPT 1", width=10)
self.graspbutton.grid(row=2, column=1)
self.parettobutton = Button(self.frameThree, text="OPT 2",width=10)
self.parettobutton.grid(row=2, column=2, pady=(10,10), padx=(10,0))
self.parettoEvolbutton = Button(self.frameThree, text="OPT 2", width=10)
self.parettoEvolbutton.grid(row=2, column=3, pady=(10,10), padx=(10,0))
def addpieza(self):
self.textopiezanuevo = Label(self.frameTwo, text = "Pieza: ", justify="left")
self.textopiezanuevo.grid(row=int(self.num_piezas)+1, column=0)
var = StringVar()
menu = OptionMenu(self.frameTwo, var, *self.mispiezas)
menu.grid(row=self.n, column=1)
menu.config(width=10)
menu.grid(row=int(self.num_piezas)+1, column=1)
var.set("One")
self.optionmenus_piezas.append((menu, var))
self.numpiezastext = Label(self.frameTwo, text = "Numero de piezas: ", justify="center")
self.numpiezastext.grid(row=int(self.num_piezas)+1, column=2, padx=(10,0))
self.entrynumpiezas = Entry(self.frameTwo,width=6)
self.entrynumpiezas.grid(row=int(self.num_piezas)+1, column=3, padx=(0,10))
self.entrynumpiezas.insert(0, "0")
self.textoprioridad = Label(self.frameTwo, text = "Prioridad: ", justify="center")
self.textoprioridad.grid(row=int(self.num_piezas)+1, column=4)
var2 = StringVar()
menu2 = OptionMenu(self.frameTwo, var2, "Normal", "Baja", "Primera pieza", "Esta semana")
menu2.config(width=10)
menu2.grid(row=int(self.num_piezas)+1, column=5)
var2.set("Normal")
self.optionmenus_prioridad.append((menu2, var2))
self.lotestext = Label(self.frameTwo, text = "Por lotes?", justify="center")
self.lotestext.grid(row=int(self.num_piezas)+1, column=6, padx=(10,0))
self.var1 = IntVar()
self.entrynumlotes = Checkbutton(self.frameTwo, variable=self.var1)
self.entrynumlotes.grid(row=int(self.num_piezas)+1, column=7, padx=(5,10))
self.lotes.append(self.var1)
self.numpiezas.append(self.entrynumpiezas)
self.num_piezas = int(self.num_piezas)+1
if __name__ == "__main__":
root = Tk()
aplicacion = Planificador(root)
root.mainloop()
FrameOne
wird verwendet, um ein Bild habe ich entfernt, um in diesem Beispiel einfacher. Und FrameThree
sind die Tasten, die Sie kann finden Sie am unteren Rand der GUI.
Also es wäre sehr hilfreich, wenn jemand könnte mir eine hand geben und mir sagen, wie man die gesamte FrameTwo
innerhalb einer Bildlaufleiste als Sie kann sehen auf dem Dritten Bild.
Vielen Dank im Voraus.
- Wie ich sehe, gibt es keine anwers, ich würde gerne wissen, ob es möglich ist, bauen Sie eine Feste Größe Schnittstelle, zum Beispiel 500x400 und legte eine scrollbar für die ganze Sache. Danke.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eins Ihrer Probleme ist, ist, dass "frameTwo" hat keine Grenzen, es ist eine Größe. Wenn Sie nicht einschränken, es ist Größe, Scrollbalken, die Sie hinzufügen, wird nie handeln. Aber die Beschränkung der Größe von Rahmen Sie haben die unangenehme begrenzen die Anzahl der Zeilen können Sie raster, so dass die scrollbar wieder wertlos.
Lösung schafft einen Rahmen innerhalb der "frameTwo", erhalten die Stücke, die Sie erstellen. Dieser Weg, von einer hand, ermöglichen Sie zum beschränken der Größe von "frameTwo" und befestigen Sie die Bildlaufleiste, um es, und von anderen Seite, erlauben Sie die raster der Stücke, die Sie hinzufügen, um den frame befindet sich innen "frameTwo", namens, sagen wir mal, "ListFrame". wenn "ListFrame" Größe wird größer als "frameTwo" Größe, können Sie nun die Bildlaufleiste zu arbeiten.
Ich den code ändern mit den oben genannten änderungen. Überprüfen Sie es heraus.
Die änderungen sind Kommentare im code.
Sorry für die kurze Erklärung, aber ich bin ein bisschen in Eile. Ich kann Sie Bearbeiten diese Antwort, wenn ich mehr Zeit habe.
PS: Sorry, wenn mein Englisch ist nicht das beste
Haben Sie die option Menüs, labels, Eingabefelder und Kontrollkästchen in FrameTwo. Wie würden Sie erwarten, dass eine scrollbar für das gesamte Bild funktionieren würde? Würde es scrollen alle widgets zur gleichen Zeit? Tkinter scrollbars sind im Allgemeinen befestigt zu Listboxen, Leinwände, entry widgets und text-Felder. http://effbot.org/zone/tkinter-scrollbar-patterns.htm Kommen mit ein einfaches Beispiel, das veranschaulicht das problem weiter helfen.