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.
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.
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.
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.
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.