Tkinter'da Scrollbar yaparken hata alıyorum

https://paste.ubuntu.com/p/6Rk5Vdf9Zw/

kodum yukarıda belirttiğim linkte kullanıcı bölümü

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python3.6/tkinter/__init__.py", line 1705, in __call__
    return self.func(*args)
  File "sesliasistanyonetim.py", line 134, in <lambda>
    b2 = Button(anapanelpencere2,text=u"Kullanıcıların Bölümü",fg="white",bg="blue",command=lambda:kullanicibolum().kullanicilistele())
  File "sesliasistanyonetim.py", line 109, in kullanicilistele
    container.pack()
  File "/usr/lib/python3.6/tkinter/__init__.py", line 2143, in pack_configure
    + self._options(cnf, kw))
_tkinter.TclError: cannot use geometry manager pack inside . which already has slaves managed by grid

böyle hata almaktayım scrolbar çalışmıyor ne yapmam lazım bakarak çalıştırarak yardımcı olursanız sevinirim

giriş kullanıcı adı : admin

giriş şifre : admin123

Hatayı okursanız aslında sorunun nereden kaynaklandığının açıkça ifade edildiğini anlarsınız. Hata çıktısı okumayı alışkanlık haline getirmenizi tavsiye ederim. Çünkü hangi satırdaki ifadeden ve ne tip bir hata aldığınızı hata çıktısına bakarak öğrenebilirsiniz. Üstelik buna benzer hataların neden oluştuğunu sormak yerine, hata çıktısını inceleyerek hatanın nerede olduğunu bulmanızın, sizi geliştiren, kendi kaynaklarınıza başvurarak sorunları çözmenize yardımcı olan bir tarafı var.

Satır 109’da bulunan container.pack() ifadesi yüzünden hata alıyorsunuz, çünkü container isimli widgetin parent widgetine child widgetlerini yerleştirirken grid metodunu kullanmışsınız.

1 Beğeni

evet peki gridleri pack yapacak olursam nasıl tekrarlanabilir şekilde yapabilirim

bu yüzden demekki scrollbar çalışmıyor hmmmm

Varsayalım 10 tane widgeti, for döngüsü kullanarak, hizalı bir şekilde ekrana eklemek için grid metodunu kullanıyorsunuz. Ardından da y ekseninde kullanılmak üzere bir tane scrollbar ekleyeceksiniz, bu scrollbar ekranın sağ tarafında yer alacak ve bu scrollbar'ın tüm ekranı da kaplamasını istiyorsunuz. Bunun için scrollbar'ı ekrana pack metoduyla eklemek aklınıza geliyor. Böyle bir durumda, grid metodu kullanılarak ekrana eklenecek widgetleri, başka bir widgetin içine, örneğin bir Frame widgetinin içine eklersiniz. Frame widgetini ekrana yerleştirmek için de pack metodunu kullanırsınız. Böylece scrollbar'ı, pack metodunu kullanarak ekrana ekleyebilirsiniz.

nasıl yani anlamadım kodun içinde yaparak örnek gösterebilirmisiniz?

nasıl yani anlamadım kodun içinde yaparak örnek gösterebilirmisiniz?

Dostum, aynı şeyi iki defa yazmanıza gerek yok. Merak etmeyin, birazdan kodu paylaşacağım sizinle. Az sabredin lütfen.

tamam allah razı olsun

Buyrun:

import tkinter as tk


def create_widgets(master, texts: list):
    widgets = []
    for index, text in enumerate(texts):
        label = tk.Label(master=master, text=text)
        label.grid(row=index, column=0, sticky="w")
        entry = tk.Entry(master=master)
        entry.grid(row=index, column=1, sticky="w")
        widgets.append(entry)
    return widgets
        
        
def main():
    root = tk.Tk()
    canvas = tk.Canvas(master=root)
    frame = tk.Frame(master=canvas)
    texts = [f"Label {i}" for i in range(100)]
    widgets = create_widgets(master=frame, texts=texts)
    y_scrollbar = tk.Scrollbar(
        master=root,
        orient="vertical",
        command=canvas.yview
    )
    canvas.configure(yscrollcommand=y_scrollbar.set)
    y_scrollbar.pack(side="right", fill="y")
    canvas.pack()
    canvas.create_window((0, 0), window=frame, anchor="nw")
    frame.bind(
        sequence="<Configure>",
        func=lambda event: canvas.configure(
            scrollregion=canvas.bbox("all")
        )
    )
    root.mainloop()
    
    
main()

Burada oluşacak olan bütün widgetler, frame isimli bir çerçeveye eklendi. tk.Frame widgetinin y_view komutu olmadığı için, bu widgeti tk.Canvas widgetinde oluşacak olan bir pencere gibi ayarladım. Çünkü tk.Canvas widgetinde y_view metodu kullanılabiliyor. Dikkatinizi frame widgetinin pack ile ekrana yerleştirilmediğine vermenizi rica ediyorum. pack ile ekrana eklenen widgetler, tk.Canvas ve tk.Scrollbar widgetleri. tk.Frame widgeti ekrana eklenecek olan diğer widgetlerinin ebeveyn widgeti.

Aşağıdaki örnek aslında konuyu daha rahat anlamanız için daha ideal bir örnek. Scrollbar yerine bu kez button kullanılan bir örnek bu. Scrollbar işin içine girince tk.Canvas'ı kullanmamız gerekiyor. Bu yüzden sizinle tk.Frame ile ilgili yukarıda bahsettiğim yöntemi tam anlamıyla yansıtan bir örnek paylaşayım:

import tkinter as tk


def create_widgets(master, texts: list):
    widgets = []
    for index, text in enumerate(texts):
        label = tk.Label(master=master, text=text)
        label.grid(row=index, column=0, sticky="w")
        entry = tk.Entry(master=master)
        entry.grid(row=index, column=1, sticky="w")
        widgets.append(entry)
    return widgets
        
        
def main():
    root = tk.Tk()
    frame = tk.Frame(master=root)
    frame.pack()
    texts = [f"Label {i}" for i in range(5)]
    widgets = create_widgets(master=frame, texts=texts)
    button = tk.Button(master=root, text="Test")
    button.pack()
    root.mainloop()
    
    
main()

Burada, tk.Button ve tk.Frame widgetleri ekrana pack komutu ile, tk.Frame widgetinin içine de 10 adet widget grid metoduyla yerleştiriliyor.

Yani kural şu: Eğer bir widgeti ebeveyn widgetine grid ile ekliyorsanız, aynı ebeveyne sahip olan diğer widgetleri de grid metodu ile eklemelisiniz. Yukarıdaki her iki örnekte de pack ile ekrana yerleştirilen widgetlerin ebeveyn widget tk.Tk(). grid ile ekrana yerleştirilen widgetlerin ebeveyn widgeti ise tk.Frame.

yapmak istediğim buna benzer ama listeye almayacağım benimki kodlarımı paylaştım oradan görebilirsiniz

https://paste.ubuntu.com/p/6Rk5Vdf9Zw/

kod burada

class kullanicibolum():
def kullanicilistele(self,):

hemen altında yer almakta hatayı veren kısım

Dostum gerekli değişikliği neden yapmıyorsunuz? Yani siz bu for döngüsünde oluşturulan widgetleri kullanicipanel isimli ana widgete eklemişsiniz. Ebeveyn widgetini scrollable_frame olarak değiştirin, sorun çözülür.

bir sorum daha olacak dediğinizi yaptım sorun ortadan kalktı ama framenin arka plan rengini değiştiremiyorum

Ekran Görüntüsü - 2020-05-21 19-56-27

lütfen yardımcı olurmusunuz?

#0080ac Renk kodum budur

Siz Frame widgetini, ttk kütüphanesini kullanarak oluşturmuşsunuz. ttk widgetlerine stil kazandırmanın yolu tk widgetlerinkinden biraz farklı. Her bir ttk widgetinin stil ismi var. Bu stil isimlerini ve Style sınıfını kullanarak stil oluşturmalısınız.

Örnek:

import tkinter as tk
from tkinter.ttk import Frame, Button, Style

root = tk.Tk()

style = Style()
style.configure("TFrame", background="red")
style.configure("TButton", background="blue")

frame = Frame(master=root, width=50, height=50, style="TFrame")
frame.pack()

button = Button(master=root, text="Test", style="TButton")
button.pack()

root.mainloop()

Ekran Görüntüsü - 2020-05-21 19-56-27

Yine Aynı Böyle Gözüküyor

Kodlarınıza tekrardan bir bakalım.