burada kodum mevcut benim yapmak istediğimi size izah etmeye çalışacağım şimdi ben bu iki penceredeki işaretlediğim yeri ana pencere sonuc bölümünde toplayıp göstermek istiyorum yani basitçe toplam başarılı ve başarısız proxyleri göstermek istiyorum
pastebin şifresi 123456
Yapmaya çalıştığınız işlemi paylaştığınız kod üzerinden göstermek zaman alıcı bir iş. Ama ne yapmak istediğinizi anladığımı düşünüyorum. Ve size fikir vermesi açısından, aşağıdaki kodu sizinle paylaşıyorum.
Aşağıdaki kodu çalıştırdığınızda, karşınıza bir adet tk.Entry
ve bir adet tk.Button
nesnesi gelir. tk.Button
nesnesinin text
parametresinin değeri Toplevel Aç
. Bu düğmeye her tıkladığınızda yeni bir tk.Toplevel
nesnesi oluşturulur. Her bir tk.Toplevel
nesnesinde bir adet tk.Label
widgeti yer alır. tk.Toplevel
nesnesi oluştuktan 1 saniye
sonra tk.Label
'in değeri değiştirilir (99 saniye boyunca, her saniyede bir, bu widgetin değeri sürekli değiştirilir). Ve ana pencerede yer alan tk.Entry
widgetine değişen bu değerler yazdırılır. Birden çok tk.Toplevel
widgeti açarsanız, tk.Entry
widgetine, bütün tk.Label
widgetlerindeki değerlerin toplamı yazılır.
Bu örnekte dikkatinizi çekmek istediğim şey şu; tanımladığımız widgetleri, fonksiyonların parametrelerinin değeri olarak atadığımızda, iki ayrı pencere arasında veri transferi yapabiliriz.
Siz de benzer şekilde ana pencerenizde yer alan bir widgeti, toplevel
'i açan fonksiyona parametre olarak atayıp, toplevel
'de gerçekleşen bir işlem ile widgetin değerini değiştirebilirsiniz.
Kod:
import tkinter as tk
def deger_degistir(entry, root, label, deger):
try:
label["text"] = deger
entry.delete("0", "end")
entry.insert(
"insert",
sum(int(i["text"]) for i in root.labels if i["text"])
)
except tk.TclError:
pass
def on_delete_window(root, toplevel, label):
root.labels.remove(label)
toplevel.destroy()
def toplevel_ac(root, entry):
toplevel = tk.Toplevel()
toplevel.geometry("100x100")
label = tk.Label(master=toplevel)
label.pack()
# label widgetini root.labels listesine ekliyoruz.
root.labels += [label]
toplevel.wm_protocol(
"WM_DELETE_WINDOW",
lambda: on_delete_window(root, toplevel, label)
)
for i in range(1, 100):
# toplevel açıldığında 99 saniye boyunca deger_degistir
# isimli fonksiyon değeri değişen 'deger' parametresi ile
# çağrılacak.
root.after(
i * 1000,
lambda deger=i: deger_degistir(entry, root, label, deger)
)
def main():
root = tk.Tk()
# button isimli düğmeye her basıldığında label widgeti oluşacak.
# ve her bir label widgeti root.labels listesine dahil edilecek.
# böylece her bir label widgetindeki değişen değerler
# toplanıp entry widgetine yazdırılacak
root.labels = []
entry = tk.Entry(master=root)
entry.pack()
button = tk.Button(
master=root,
text="Toplevel Aç",
command=lambda: toplevel_ac(root, entry)
)
button.pack()
root.mainloop()
if __name__ == "__main__":
main()
ben sizin dediğiniz gibi yolda gidersem diyelim ki 4 adet TopLevel penceresi var ve bunun içerisindeki değerleri almak ve 4 ünü toplayım ana pencereye yazdırtmak işlemini nasıl yapabilirim?
Yukarıdaki örnek tam olarak bunu yapıyor işte. İsterseniz 10 tane tk.Toplevel
widgeti oluşturun, ana penceredeki tk.Entry
widgetinin değeri, farklı tk.Toplevel
widgetlerinde yer alan tk.Label
widgetlerinin an içerisinde aldığı değerlerin toplamı olacaktır. İsterseniz kodu çalıştırın, kendi gözlerinizle görün.
Edit: Tavsiyem, kodun özellikle tkinter ile ilgili olan kısmını, daha okunaklı ve fonksiyonlar arasında parametre alışverişine izin verecek şekilde yeniden yazmanız yönünde.