Python Tkinter Button hk

Merhabalar tkinterla bir arayüz tasarlıyordumda. Resimde görülen butona tıklayınca textboxun rengini değiştirmek istiyorum birtürlü beceremedim yardım edebilirmisiniz. Basitçe anlatırsanız sevinirm.

self.arkaplan_değiş = Button(cursor="hand2",text = "TextBox Arkaplan Rengi Değiştir",fg="purple",overrelief="groove") self.arkaplan_değiş.place(rely= 0.2)

Kodum bu Buttons adı verilen bir fonksiyonun içerisinde ve ben

def TextBox (self): self.textBox = Text(root) self.textBox.pack()

Bu textboxun rengibi değiştirmek istiyorum o butona basınca ve ayrıca şöyle birşey olacak.

butona basınca arkaplan siyahsa beyaz, yazı rengide beyazsa siyah
tekrardan basınca tam tersi olacak.

def değiştir(self):
     if(self.textBox["bg"]=="black"):
         self.textBox.config(bg="white", fg="black")
    else:
        self.textBox.config(bg="black", fg="white")
#Bundan sonraki kod __init__ metodunda olacak.
self.arkaplan_değiş.bind("<1>", değiştir)

indention hatası verebilir. Onu siz halledersiniz

1 Beğeni

Bu konuya benzer bir sorum olacak.
Butona basıldığında bir fonksiyona yönlendirmeden ziyade butona basıldığı sürece True çıkışı alabilirmiyim?
Mesela
if buton == True
gibi yada command = lambda: button = True
gibi

Merhaba @Engin_Kanat,
Aşağıdaki kodları bir inceleyin isterseniz.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from time import sleep
from threading import Thread
from tkinter import Tk, Button

root = Tk()

button = Button(root, text="Button")
button.pack()


def start(event):
    global hold_on
    hold_on = True
    while hold_on:
        print(hold_on)
        sleep(0.1)
                  
    
def end(event):
    global hold_on
    hold_on = False
    print(hold_on)
    

button.bind(
    "<ButtonPress>", 
    lambda event: Thread(target=start, args=(event, )).start()
)
button.bind("<ButtonRelease>", end)

root.mainloop()

Sayın dildeolupbiten, anladığım kadarıyla ‘bind’ ifadesi bir olay bir değişiklik oldu gibi bir iş yapıyor. Sleep olayını ve parametrelerini araştıracağım eve gidince. Target ise bir hedef belirliyor. Button da bir değişiklik oluştuğunda hedefin ilk olarak start fonksiyonu olmalı ama bu hedefe giderken yanında butona basılı olduğu bilgisinide götür. Doğrumu anlamışım acaba.!

Bazı ifadeleri koymamın belli gerekçeleri var onları sizinle paylaşayım.

  1. time modülünün sleep fonksiyonunu, düğmeye basılınca aniden çok fazla True yazısı ekrana yazdırılmasın diye koydum. Yani True değerleri daha yavaş yazdırılsın diye koydum.

  2. threading modülünün Thread sınıfından bir örneği, start fonksiyonunda while döngüsü kullanmayı düşündüğüm için kullandım. Çünkü while döngüsü çalıştığı an, programın diğer kısımlarına erişmek mümkün olmayacak. Ama Thread ile bu mümkün. Yani, bir taraftan, tuşa bastığımız sürece while döngüsü çalışırken, öte yandan tuşa basmaktan vazgeçtiğimiz anda hemen end fonksiyonu çalışsın diye, start fonksiyonu bir Thread nesnesinin hedefi yapıldı. end fonksiyonunu bir Thread nesnesinin hedef fonksiyonu haline getirmek gerekli değildi, çünkü programı start fonksiyonu gibi bloklayacak herhangi bir işleme sahip değil.
    target, args, bunlar Thread sınıfının parametreleridir, target parametresine bir fonksiyon yazılır, args parametresine ise, varsa bu çağrılan fonksiyonun aldığı parametreler yazılır. Eğer çağrılan fonksiyonun parametresi yoksa, args parametresini kullanmazsınız. Daha ayrıntılı bilgi için threading modülünü incelemeniz gerekiyor. https://belgeler.yazbel.com/python-istihza/standart_moduller/threading.html

  3. bind ise tkinter'de her bir widget için kullanılabilen bir fonksiyondur. Bağlama anlamına geliyor. Birinci argümanı bir olay formatıdır, ikinci argümanı ise bu olay gerçekleşince çağrılacak fonksiyondur.

bind ile ilgili biraz daha fazla bilgi elde etmek için şu sayfayı incelemenizi öneririm.
https://effbot.org/tkinterbook/tkinter-events-and-bindings.htm

1 Beğeni

Teşekkürler, çok ilgilisiniz. Sayenizde, bir gün sizin seviyenizin 1/1000’ine ulaşabilirim.

Yok, gözünüzde büyütmeyin beni lütfen. İyi çalışmalar, kolay gelsin.

Şimdi yeri ve zamanı değil aslında. Ben bu işe oğlum için başladım. Hayatı bilgisayar yada telefon başında oyun ile geçiyor. Ben sizlerden yada diğer sitelerden öğrenip O’na anlatıyorum ve önceden yapabildiğim programları ödev olarak veriyorum. Benim uyguladığım metodların dışında bir metod uyguladığı da buradan soruyorum. Hem ben hem oğlum öğreniyor.
Amacım: madem bu oyunu oynuyorsun nasıl çalıştığını öğren. Sizin bind için önerdiğiniz siteden ekrandan koordinat almayı öğrendim mesela. Artık kendiside biliyor. Oynadığı karakter dokunduğu alana nasıl gittiğini.
Lütfen sizden öğrenecek daha çok şeyimiz var. Tekrar teşekkür ederim.

1 Beğeni

Yazınızı okurken mutlu oldum. Genç arkadaşımıza benden bir selam iletin lütfen. :relaxed:

1 Beğeni

Sayın @dildeolupbiten, Button olayının focus özelliği var mı?
Mesela; butonda bir değişiklik var ise gidip x değişkeninin değerinin değişip değişmediğine bak gibi birşey yazabilirmiyiz! Halen vbasic ten kendimi kurtaramadım
Birde bu soru ile alakası var mı bilmem ama ’ lambda değer : değer = Entry.get() neden hata verir…?

‘=’ olayını kabul ettiremedim bir türlü
Burada ‘değer’ lambda nın return ü değil mi

button focus derken tam olarak ne demek istediğinizi anlamadım. Şöyle bir şeyden mi bahsediyorsunuz?

tk = __import__("tkinter")
root = tk.Tk()
frame = tk.Frame(root, width=500, height=500)
frame.bind(
    "<Button-1>", 
    lambda event: print("x =", event.x, ", y =", event.y)
)
frame.pack()
root.mainloop()

burada lambda fonksiyonu kullanmaya ihtiyacınız var mı? yani değer = Entry.get() ifadesinin iş görüyor olması gerekir diye düşünüyorum.

lambda fonksiyonunda, = işaretini, def fonksiyonunda kullandığınız gibi kullanamazsınız.

Lambda’nın return ettiği değer, : işaretinin sağında kalan kodlardır. dolayısıyla return ettiğiniz değerin bir veri tipi olmalıdır. f = lambda x: x = ... gibi bir ifadeyi kullanamayız. Bunun yerine f = lambda x: ... gibi bir ifade kullanmak lazım.
f’in yerine y karakterini de kullanabiliriz:

1 Beğeni

@dildeolupbiten ustam.

TextBox1.Focus()
    TextBox1.SelectionStart = TextBox1.TextLength

Burada textBox1 üzerindeki değişikliği Focus ile belirleyip vb de imleci sona alabiliyorsun gibi
Python da butonName.Focus(clicked)
value = entry.text()
gibi bir kodlama varmı diye merak ettim.
Bu arada herkese iyi bayramlar

focus fonksiyonunu daha çok textbox ve treeview'da kullandım. Buton için çok gerek duymadım. Çünkü zaten buton’a tıkladığımız zaman bir fonksiyon çalıştırabiliyoruz.

merhaba, halihazırda tasarladığım bir arayüz ve arayüzün içerisinde de dosya seç, video gönder gibi butonlar var. tkinter kütüphanesini kullanarak bu butonları nasıl kullanabilir hale getirebilirim? (arayüz her daim açık olacak, gerektiği zaman 'dosya seç’e tıkladığımda önüme ekran gelecek ve dosyayı seçeceğim, ardından video gönder butonuyla göndereceğim. nasıl yapabilirim bunu? şimdiden çok teşekkürler @dildeolupbiten

Merhaba,

tk.Button nesnesinin command isimli bir parametresi var. Bu parametreye istediğiniz işlemi yapan fonksiyonun adresini atamanız gerekiyor.

Örneğin:

import tkinter as tk

from tkinter.filedialog import askopenfilename

root = tk.Tk()


def dosya_sec():
    """
    Bu fonksiyon seçilen dosyanın ismini string olarak geri döndürür.
    """
    try:
        return askopenfilename(
            initialdir="./",
            title=f"Dosya Seç",
            filetypes=[("TXT Files", "*.txt")]
        )
    except FileNotFoundError:
        return ""


dosya_sec_dugmesi = tk.Button(
    master=root, 
    text="Dosya Seç", 
    command=dosya_sec
)
dosya_sec_dugmesi.pack()

root.mainloop()

Burada size gösterdiğim örnek, sadece dosyayı seçmenize yarar. Gönderme işlemini mail olarak mı yapacaksınız, socket kütüphanesini mi kullanacaksınız bilmiyorum. Duruma göre tk.Button'a basıldığı zaman çağrılacak fonksiyonun içi düzenlenebilir. Belki dosya_sec düğmesi sadece dosyayı seçer, hemen altında tanımlayacağınız Gönder isimli bir düğme de dosyayı gönderir. Tasarım kısmı size kalmış. İster tek bir düğme ile hem dosyayı seçer hem de seçilen dosyayı gönderebilirsiniz, ister dosya seçme ve gönderme işlemlerini ayırıp her bir işlem için ayrı düğmeler tanımlayabilirsiniz. Size kalmış.