Arka planda çalışan python uygulama

Arkadaşlar merhaba. Ben minecraft için kendime kısayollar yapacağım. bir küçük deneme yaptım fakat cpu kullanımı çok yüksek. bunun sebebi while döngüsünde olduğunu biliyorum. while harici bir komut ile bu uygulamayı arka planda çalıştırabilir miyiz?

import pyautogui
import keyboard

while True:
        if keyboard.is_pressed("r"):

            pyautogui.press("8", interval= 0.05)
            pyautogui.click(button="right")
                #pyautogui.press("7", interval= 0.05)
                #pyautogui.press("6", interval= 0.05)
                #pyautogui.press("5", interval= 0.05)
                #pyautogui.press("4", interval= 0.05)
                #pyautogui.press("3", interval= 0.05)
                #pyautogui.press("2", interval= 0.05)
                
            pyautogui.press("9", interval= 0.05)

            pyautogui.click(button="right", interval= 0.01)
            pyautogui.click(button="right", interval= 0.01)
            pyautogui.click(button="right", interval= 0.01)
            pyautogui.click(button="right", interval= 0.01)
            pyautogui.click(button="right", interval= 0.01)
            pyautogui.click(button="right", interval= 0.01)
            pyautogui.click(button="right", interval= 0.01)
            pyautogui.click(button="right", interval= 0.01)
                
                

            pyautogui.press("1", interval= 0.05)
        if keyboard.is_pressed("*"):
            break

Arada sleep ile uyuyabilirsiniz. Tepki verme hizini kotu bir hale getirmeyecek en yuksek sureyi kullanabilirsiniz—1 saniye veya 100 ms guzel bir baslangic degeri—ama 0 bile, scheduler’larin calisma seklinden dolayi, hic uyumamaktan kat be kat performansli olacaktir. While loop’unun sonuna veya basina koyabilirsiniz.

2 Beğeni

Baska yontemler: Kutuphaneye “tusa basilinca beni cagir” diyip uyumak. Veya “tusa basilinca beni cagir” diyip kutuphanenin “sonsuza kadar kadar calis” isini yapan ve donmeyen (veya sonsuz dongu icinde cagrilan) fonksiyonunu cagirmak.

Veya yukaridaki yontemi kutuphanenin “bir sey oluncaya kadar uyu” uyku fonksiyonuyla yapmak.

Bunlar tabi kutuphanenin destegine bagli.

2 Beğeni

aib hocam teşekkür ederim ama yanlış anlamayın çok iyi anlamadım. örnekler üzerinde gösterebilir misiniz?

​​​​​​​​​​​​​​​​​​​​

1 Beğeni

Kısayol ihtiyacı.

Kısıtlama.

Doğrı tespit.

Evet.

İşletim sistemleri kısayol tanımlamaya ve kullanmaya izin verir.

Genelde hot key olarak tanımlanır.

import keyboard
import time

def benim_fonksiyonum():
    print("Kısayol tuşuna basıldı! İşlem başlıyor...")
    time.sleep(2)  
    print("İşlem tamamlandı, tekrar bekleniyor...")


keyboard.add_hotkey('ctrl+alt+h', benim_fonksiyonum)

print("Arka planda çalışıyor... (Çıkış için Ctrl+C)")
keyboard.wait()

Basit kullanım örneği.

2 Beğeni

hepinize teşekkür ederim hocalarım. iyi günler.

Ay pardon, 0.050 olacak. C# yaziyorum da su aralar…

1 Beğeni

@aib @semtex hocalarım bir tane daha sorum olacak. şimdi ben bu macroyu bir arayüz üzerine yapacağım ve neredeyse bitti. ama sıkıntı şu ki benim bu arayüz uygulamasını kapatsam bile makronun arka planda çalışması lazım. yani bu uygulamayı sistem tepsisine taşımam gerekli. bunu tkinter da nasıl yapabilirim?

eğer ki herhangi bir çözüm yoksa macroyu farklı bir dosyada yapacağım ordan çalışacak

import keyboard
import threading
import pystray
from PIL import Image, ImageDraw, ImageFont
import sys
import tkinter as tk
from tkinter import messagebox
from concurrent.futures import ThreadPoolExecutor

class ShortcutApp:
    def __init__(self):
        self.thread_pool = ThreadPoolExecutor(max_workers=2)
        self.is_running = threading.Event()
        self.is_running.set()
        self.is_message_showing = threading.Event()
        self.ctrl_alt_h_active = True
        self.ctrl_alt_s_active = True
        self.tray_icon = None

    def shortcut_function(self, shortcut):
        if not self.is_running.is_set() or self.is_message_showing.is_set():
            return
        self.is_message_showing.set()

        def execute_function():
            messagebox.showinfo("Shortcut", f"{shortcut} shortcut pressed!")
            self.is_message_showing.clear()

        self.thread_pool.submit(execute_function)

    def add_shortcuts(self):
        if self.ctrl_alt_h_active:
            keyboard.add_hotkey('ctrl+alt+h', lambda: self.shortcut_function('Ctrl+Alt+H'))
        if self.ctrl_alt_s_active:
            keyboard.add_hotkey('ctrl+alt+s', lambda: self.shortcut_function('Ctrl+Alt+S'))

    def remove_shortcuts(self):
        try:
            keyboard.remove_hotkey('ctrl+alt+h')
            keyboard.remove_hotkey('ctrl+alt+s')
        except:
            pass

    def update_shortcuts(self):
        self.remove_shortcuts()
        self.add_shortcuts()

    def start_shortcuts(self):
        self.is_running.set()
        self.update_shortcuts()
        if self.ctrl_alt_h_active or self.ctrl_alt_s_active:
            print("Shortcuts enabled.")
        else:
            print("Shortcuts disabled.")
        self.update_tray_menu()

    def stop_shortcuts(self):
        self.is_running.clear()
        self.update_shortcuts()

    def close_application(self, icon, item):
        self.stop_shortcuts()
        icon.stop()
        self.thread_pool.shutdown(wait=False)

    def toggle_ctrl_alt_h(self, icon, item):
        self.ctrl_alt_h_active = not self.ctrl_alt_h_active
        self.start_shortcuts()

    def toggle_ctrl_alt_s(self, icon, item):
        self.ctrl_alt_s_active = not self.ctrl_alt_s_active
        self.start_shortcuts()

    def update_tray_menu(self):
        menu = pystray.Menu(
            pystray.MenuItem("Ctrl+Alt+H", self.toggle_ctrl_alt_h, checked=lambda item: self.ctrl_alt_h_active),
            pystray.MenuItem("Ctrl+Alt+S", self.toggle_ctrl_alt_s, checked=lambda item: self.ctrl_alt_s_active),
            pystray.MenuItem("Exit", self.close_application)
        )
        self.tray_icon.menu = menu

def create_icon():
    img = Image.new('RGBA', (64, 64), (0, 0, 0, 0))
    draw = ImageDraw.Draw(img)
    font = ImageFont.truetype("arial.ttf", 36)
    draw.text((20, 15), "S", fill=(255, 0, 0), font=font)
    return img

if __name__ == "__main__":
    app = ShortcutApp()
    menu = pystray.Menu(
        pystray.MenuItem("Ctrl+Alt+H", app.toggle_ctrl_alt_h, checked=lambda item: app.ctrl_alt_h_active),
        pystray.MenuItem("Ctrl+Alt+S", app.toggle_ctrl_alt_s, checked=lambda item: app.ctrl_alt_s_active),
        pystray.MenuItem("Exit", app.close_application)
    )
    app.tray_icon = pystray.Icon("test", create_icon(), menu=menu)
    app.start_shortcuts()
    print("Shortcuts enabled.")
    app.tray_icon.run()
1 Beğeni

Her zaman bir çözüm vardır. Hem de birden çok. Ama burada kaç kişi, bir oyun botu için emek sarfetmek ister ki?

Sys tray içinde aktif yada pasif hale getirilebilecek iki kısayol içeren basit bir örnek kodu yukarı bıraktım. Mesaj kutusu çağırdığı satırlardan makrolarına ait kodlarını çağırabilirsin.

Kısmen dah az kaynak kullanması için threading pool kullandım. Threading ile de yapabilirsin.

yada makrolarını farklı bir yerde tutup, sistem çağrısı ile dışardan da çalıştırabilirsin.

Buraya genel bir sistem tepsisi örneği bıraktım. Kodunu linux türevleri ile uyumunu denemedim, windows sistem tepsisinde sorunsuz çalıştığını ve kısa yolları yakaladığını test ettim.

Kolay gelsin.

1 Beğeni

valla hocam keşke sizin kadar bilebilsem ama çok teşekkür ederim. Bunları analiz edeceğim. Bir de programımda var olan diğer bir verimsizlikten bahsedeceğim. tkinter kitaplığında hangi butona bastığımızı algılayabiliyor muyuz? Çünkü uygulamada fazlaca buton var ve bu butonlara tek tek command yazmak verimsiz geliyor. Mesela bir butona basıcam ve ben o butonun yanındaki label değişecek.

import pyautogui
from tkinter import *
from tkinter import ttk
from tkinter import messagebox
import sqlite3
import keyboard
import threading
con = sqlite3.connect("database\database.db")
cursor = con.cursor()


cursor.execute("CREATE TABLE IF NOT EXISTS controlls (controls TEXT,controls2 TEXT,controls3 TEXT,closeoropen TEXT, giriş INT)")
con.commit()
window = Tk()
window.geometry("500x500")
window.resizable(False, False)
def giriskontrol():
    con = sqlite3.connect("database\database.db")
    cursor = con.cursor()
    cursor.execute("Select * From controlls where giriş = ?", (1,))
    list = cursor.fetchall()
    if len(list)== 0:
        cursor.execute("Insert into controlls Values(?,?,?,?,?)", ("None","None","None","Kapalı", 1))
        con.commit()
    else:
        lambda: None

giriskontrol()

var = 0

notebook = ttk.Notebook(window)
notebook.place(x = 0, y= 2)

frame1 = Frame(notebook)

notebook.add(frame1, text="Genel Ayarlar")


a = Label(frame1, width=70, height=30)
a.pack()

controls = Label(frame1,text="Kontroller:", font=(20))
controls.place(x=1)
def macroc():
    

    def benim_fonksiyonum():
        for i in range(0):
            print("a")


    keyboard.add_hotkey('Ctrl+Alt+B+c+d+f+g+h+j+k+l+ş', benim_fonksiyonum)
    keyboard.add_hotkey('a', benim_fonksiyonum)
    print("Arka planda çalışıyor... (Çıkış için Ctrl+C)")
    keyboard.wait()
    
    
thread = threading.Thread(target= macroc, daemon= True)
thread.start()

macrolabe= Label(frame1, text="1. Makro Başlatma Tuşu:" )
macrolabe.place(x= 5, y= 30)
macrolabe2= Label(frame1, text="2. Makro Başlatma Tuşu:" )
macrolabe2.place(x= 5, y= 70)
macrolabe3= Label(frame1, text="3. Makro Başlatma Tuşu:" )
macrolabe3.place(x= 5, y= 110)
def do(event):
    global var
    cursor.execute("Select controls,controls2,controls3 From controlls" )
    listee = cursor.fetchall()
    stringlist = "".join(listee[0][0])
    stringlist2 = "".join(listee[0][1])
    stringlist3 = "".join(listee[0][2])
    if var == 0:
        if f"{(event.keysym).upper()}" == stringlist2:
            macrobutton["text"]=f"    {"".join(stringlist)}    "
            messagebox.showerror("Hata", "Aynı tuşları atayamazsınız")
        elif f"{(event.keysym).upper()}" == stringlist3:
            macrobutton["text"]=f"    {"".join(stringlist)}    "
            messagebox.showerror("Hata", "Aynı tuşları atayamazsınız")

        else:
            cursor.execute("Update controlls set controls = ? where controls = ?",(f"{(event.keysym).upper()}", f"{"".join(macrobutton["text"]).strip("<> ")}"))
            con.commit()
            macrobutton["text"] = f"    {(event.keysym).upper()}    "
        
    var+= 1
def do2(event):
    global var
    cursor.execute("Select controls,controls2,controls3 From controlls" )
    listee = cursor.fetchall()
    stringlist = "".join(listee[0][0])
    stringlist2 = "".join(listee[0][1])
    stringlist3 = "".join(listee[0][2])
    if var == 0:
        if f"{(event.keysym).upper()}" == stringlist:
            macrobutton2["text"]=f"    {"".join(stringlist2)}    "
            messagebox.showerror("Hata", "Aynı tuşları atayamazsınız")
        elif f"{(event.keysym).upper()}" == stringlist3:
            macrobutton2["text"]=f"    {"".join(stringlist2)}    "
            messagebox.showerror("Hata", "Aynı tuşları atayamazsınız")
        else:
            cursor.execute("Update controlls set controls2 = ? where controls2 = ?",(f"{(event.keysym).upper()}", f"{"".join(macrobutton2["text"]).strip("<> ")}"))
            con.commit()
            macrobutton2["text"] = f"    {(event.keysym).upper()}    "
        
    var+= 1
def do3(event):
    global var
    cursor.execute("Select controls,controls2,controls3 From controlls" )
    listee = cursor.fetchall()
    stringlist = "".join(listee[0][0])
    stringlist2 = "".join(listee[0][1])
    stringlist3 = "".join(listee[0][2])
    
    if var == 0:
        if f"{(event.keysym).upper()}" == stringlist:
            macrobutton3["text"]=f"    {"".join(stringlist3)}    "
            messagebox.showerror("Hata", "Aynı tuşları atayamazsınız")
        elif f"{(event.keysym).upper()}" == stringlist2:
            macrobutton3["text"]=f"    {"".join(stringlist3)}    "
            messagebox.showerror("Hata", "Aynı tuşları atayamazsınız")
        else:
            cursor.execute("Update controlls set controls3 = ? where controls3 = ?",(f"{(event.keysym).upper()}", f"{"".join(macrobutton3["text"]).strip("<> ")}"))
            con.commit()
            macrobutton3["text"] = f"    {(event.keysym).upper()}    "
        
    var+= 1


def algılam():
    global var
    cursor.execute("Select controls From controlls" )
    liste = cursor.fetchall()
    macrobutton.config(text= f"   >{"".join(liste[0])}<   ")
    var = 0
    window.bind("<Key>", do)
def algılam2():
    global var
    cursor.execute("Select controls2 From controlls" )
    liste = cursor.fetchall()
    macrobutton2.config(text= f"   >{"".join(liste[0])}<   ")
    var = 0
    window.bind("<Key>", do2)
def algılam3():
    global var
    cursor.execute("Select controls3 From controlls" )
    liste = cursor.fetchall()
    macrobutton3.config(text= f"   >{"".join(liste[0])}<   ")
    var = 0
    window.bind("<Key>", do3)

    
cursor.execute("Select controls,controls2,controls3 From controlls" )
liste = cursor.fetchall()
stringlist = "".join(liste[0][0])
stringlist2 = "".join(liste[0][1])
stringlist3 = "".join(liste[0][2])

frame2 = Frame(notebook)
b = Label(frame2,width=70, height=30)
b.pack()
notebook.add(frame2, text="1. Makro Ayarları")

frame3 = Frame(notebook)
b = Label(frame3,width=70, height=30)
b.pack()
notebook.add(frame3, text="2. Makro Ayarları")

frame4 = Frame(notebook)
b = Label(frame4,width=70, height=30)
b.pack()
notebook.add(frame4, text="3. Makro Ayarları")
_1makro = 0
y_ = 30
def sag():
    global _1makro
    global y_
    _1makro+=1
    sıra = Label(frame2, text=f"{_1makro}.")
    sıra.place(x=284, y=y_)
    sagg = Label(frame2, text="Sağ C.")
    sagg.place(x= 300, y=y_)
    y_+= 20
def sol():
    global _1makro
    global y_
    _1makro+=1
    sıra = Label(frame2, text=f"{_1makro}.")
    sıra.place(x=283, y=y_)
    soll = Label(frame2, text="Sol C.")
    soll.place(x= 300, y=y_)
    y_+= 20
def harf():
    global _1makro
    global y_
    _1makro+=1
    sıra = Label(frame2, text=f"{_1makro}.")
    sıra.place(x=283, y=y_)
    harff = Label(frame2, text="None")
    harff.place(x= 300, y=y_)
    algı = Entry(frame2, width=2)
    algı.place(x=340, y=y_)
    assda = algı.winfo_x
    print(f"{assda}")
    
    y_+= 20
 
seçenek = Label(frame2, text="Makro Seçenekleri: ")
seçenek.place(x=5, y=1)
seçenek = Label(frame3, text="Makro Seçenekleri: ")
seçenek.place(x=5, y=1)
seçenek = Label(frame4, text="Makro Seçenekleri: ")
seçenek.place(x=5, y=1)
sagclick = Button(frame2, text="Sağ Click", command= sag)
sagclick.place(x=5,y=30 )
sagclick = Button(frame3, text="Sağ Click")
sagclick.place(x=5,y=30 )
sagclick = Button(frame4, text="Sağ Click")
sagclick.place(x=5,y=30 )
solclick = Button(frame2, text="Sol Click", command=sol)
solclick.place(x=5,y=60 ),
solclick = Button(frame3, text="Sol Click")
solclick.place(x=5,y=60 )
solclick = Button(frame4, text="Sol Click")
solclick.place(x=5,y=60 )
harfclick = Button(frame2, text="Harf veya Sayı", command=harf)
harfclick.place(x=5,y=90 )
harfclick = Button(frame3, text="Harf veya Sayı")
harfclick.place(x=5,y=90 )
harfclick = Button(frame4, text="Harf veya Sayı")
harfclick.place(x=5,y=90 )




macrobutton = Button(frame1, text=f"    {stringlist}    ", command=algılam)
macrobutton.place(x=144, y=30)
macrobutton2 = Button(frame1, text=f"    {stringlist2}    ", command=algılam2)
macrobutton2.place(x=144, y=70)
macrobutton3 = Button(frame1, text=f"    {stringlist3}    ", command=algılam3)
macrobutton3.place(x=144, y=110)





varr = IntVar()
def close():
    cursor.execute("Select controls From controlls" )
    liste = cursor.fetchall()
    keyss = "".join(liste[0])

def open():
    pass
cursor.execute("Select closeoropen From controlls" )
opensor = cursor.fetchall()
opens = "".join(opensor[0])

close_or_open = Radiobutton(frame1, text="Açık", variable= varr, value= 0)
close_or_open.place(x=10, y=300)

close_or_open1 = Radiobutton(frame1, text="Kapalı", variable= varr, value= 1 )
close_or_open1.place(x=100, y=300)

if opens == "Kapalı":
    close_or_open1["value"] = 0
    close_or_open["value"] = 1
if opens == "Açık":
    close_or_open1["value"] = 1
    close_or_open["value"] = 0



window.mainloop()

zaten farkedersin hocam.

çalıştırmak isterseniz dosyayla aynı klasörde database adında klasör olması lazım. o klasöre veri tabanı kaydolacak.

Standart Python’daki liste ve loop gibi tekrar engelleyen yapilari burada da kullanabilirsiniz.

macrolabe= Label(frame1, text="1. Makro Başlatma Tuşu:" )
macrolabe.place(x= 5, y= 30)
macrolabe2= Label(frame1, text="2. Makro Başlatma Tuşu:" )
macrolabe2.place(x= 5, y= 70)
macrolabe3= Label(frame1, text="3. Makro Başlatma Tuşu:" )
macrolabe3.place(x= 5, y= 110)
for i in range(3):
    macrolabes[i] = Label(frame1, text=f"{i}. Makro Başlatma Tuşu:" )
    macrolabes[i].place(x= 5, y= 30 + 40*i)
def algılam():
    global var
    cursor.execute("Select controls From controlls" )
    liste = cursor.fetchall()
    macrobutton.config(text= f"   >{"".join(liste[0])}<   ")
    var = 0
    window.bind("<Key>", do)
def algılam2():
    global var
    cursor.execute("Select controls2 From controlls" )
    liste = cursor.fetchall()
    macrobutton2.config(text= f"   >{"".join(liste[0])}<   ")
    var = 0
    window.bind("<Key>", do2)
def algılam3():
    global var
    cursor.execute("Select controls3 From controlls" )
    liste = cursor.fetchall()
    macrobutton3.config(text= f"   >{"".join(liste[0])}<   ")
    var = 0
    window.bind("<Key>", do3)
def algilam_generic(column, binding):
    global var
    cursor.execute(f"Select {column} From controlls" )
    liste = cursor.fetchall()
    macrobutton.config(text= f"   >{"".join(liste[0])}<   ")
    var = 0
    window.bind("<Key>", binding)

macrobuttons[i] = Button(frame1, text=f"    {stringlists[i]}    ", command=lambda: algılam_generic[i](f"controls{i+1}", dos[i])
acrobuttons[i].place(x=144, y=30 + 40*i)

veya

def algilam_maker(column, binding):
    def algilam():
        global var
        cursor.execute(f"Select {column} From controlls" )
        liste = cursor.fetchall()
        macrobutton.config(text= f"   >{"".join(liste[0])}<   ")
        var = 0
        window.bind("<Key>", binding)
    return algilam

macrobuttons[i] = Button(frame1, text=f"    {stringlists[i]}    ", command=algılam_maker[i](f"controls{i+1}", dos[i])

gibi…

1 Beğeni

teşekkürler hocam. Bazı yerlerde yapmıştım bunu ama her yerde değildi. Program bittikten sonra yeniden bir düzenleme yapacağım

Genelde callback kisimlarinda sorun cikiyor. Fonksiyon donduren fonksiyon (ve bazen onu donduren fonksiyon) yazmak kolay degil. Late binding de yardimci olmuyor.

Takilirsaniz yine sorabilirsiniz.

1 Beğeni

Kodu çalıştırmak için vakit ayıramadım.

Evet bir çok yöntem var ve fakat yaklaşım yanlışınız da olabilir birden çok butona neden gerek duydunuz?

Butonları enumarete edebilirsiniz. Burada istediğiniz event i gerçekleştirebilirsiniz, ister label değiştirin, ister hesaplama yaptırın.

def buton_fonksiyonu_1():
  print("Buton 1 tıklandı.")

def buton_fonksiyonu_2():
  print("Buton 2 tıklandı.")

def buton_fonksiyonu_3():
  print("Buton 3 tıklandı.")

buton_fonksiyonlari = [buton_fonksiyonu_1, buton_fonksiyonu_2, buton_fonksiyonu_3]

for indeks, fonksiyon in enumerate(buton_fonksiyonlari):
  print(f"Buton {indeks + 1}: {fonksiyon.__name__}")
  fonksiyon()
  print("-" * 20)

Diğer taraftan sorunuzun başına dönüp bir kodlama yaptım.

import tkinter as tk
from tkinter import ttk
import pyautogui
import keyboard
import threading
from PIL import Image, ImageDraw
import pystray
import configparser
import os

def makro1():
    pyautogui.alert("Makro 1 çalıştı!")

def makro2():
    pyautogui.alert("Makro 2 çalıştı!")

def makro3():
    pyautogui.alert("Makro 3 çalıştı!")


kisayollar = ["ctrl+a", "ctrl+b", "ctrl+c"]
makrolar = {"Makro 1": makro1, "Makro 2": makro2, "Makro 3": makro3}

kisayol_makro_map = {}  
config_file = "settings.ini"

def hotkey_listener():
    print("Kısayol dinleyici başlatıldı...")
    keyboard.wait()

def save_settings():
    config = configparser.ConfigParser()
    config["Shortcuts"] = {}
    for kisayol, var in selected_shortcuts.items():
        if var.get():  
            secilen_makro = dropdown_values[kisayol].get()
            if secilen_makro in makrolar:
                config["Shortcuts"][kisayol] = secilen_makro
    with open(config_file, "w") as configfile:
        config.write(configfile)

def load_settings():
    if os.path.exists(config_file):
        config = configparser.ConfigParser()
        config.read(config_file)
        if "Shortcuts" in config:
            return dict(config["Shortcuts"])
    return {}

def show_window(icon, item):
    icon.stop()
    root.after(0, root.deiconify)

def hide_window():
    root.withdraw()
    threading.Thread(target=icon.run, daemon=True).start()

def create_icon():
    icon_size = (64, 64)
    image = Image.new("RGBA", icon_size, (0, 0, 0, 0))
    draw = ImageDraw.Draw(image)
    draw.text((20, 15), "S", fill="white")
    menu = pystray.Menu(pystray.MenuItem("Göster", show_window))
    return pystray.Icon("app", image, "Makro Uygulaması", menu=menu)

def create_gui():
    global root, selected_shortcuts, dropdown_values
    root = tk.Tk()
    root.title("Kısayol - Makro Eşleştirme")

    selected_shortcuts = {}
    dropdown_values = {}
    saved_settings = load_settings()

    def kaydet():
        kisayol_makro_map.clear()
        for kisayol, var in selected_shortcuts.items():
            if var.get():
                secilen_makro = dropdown_values[kisayol].get()
                if secilen_makro in makrolar:
                    kisayol_makro_map[kisayol] = makrolar[secilen_makro]
                    keyboard.add_hotkey(kisayol, makrolar[secilen_makro])
            else:
                if kisayol in kisayol_makro_map:
                    keyboard.remove_hotkey(kisayol)
        save_settings()
        print("Seçimler Kaydedildi:", kisayol_makro_map)
    
    for i, kisayol in enumerate(kisayollar):
        var = tk.BooleanVar()
        chk = tk.Checkbutton(root, text=kisayol.upper(), variable=var)
        chk.grid(row=i, column=0, sticky="w")
        selected_shortcuts[kisayol] = var
        
        dropdown_values[kisayol] = tk.StringVar()
        combo = ttk.Combobox(root, textvariable=dropdown_values[kisayol], values=list(makrolar.keys()))
        combo.grid(row=i, column=1, padx=5, pady=2)
        
        
        if kisayol in saved_settings:
            var.set(1)
            dropdown_values[kisayol].set(saved_settings[kisayol])
            kisayol_makro_map[kisayol] = makrolar[saved_settings[kisayol]]
            keyboard.add_hotkey(kisayol, makrolar[saved_settings[kisayol]])
        else:
            var.set(0)  
    
    btn_kaydet = tk.Button(root, text="Kaydet", command=kaydet)
    btn_kaydet.grid(row=len(kisayollar), column=0, pady=10, columnspan=2)
    
    btn_gizle = tk.Button(root, text="Gizle", command=hide_window)
    btn_gizle.grid(row=len(kisayollar) + 1, column=0, pady=10, columnspan=2)
    
    threading.Thread(target=hotkey_listener, daemon=True).start()
    global icon
    icon = create_icon()
    
    root.mainloop()

create_gui()

Burada makro ve kısayollarınızı kolayca denetleyebilir ayarlarını kaydedebilirsiniz. Ben .ini dosyası kulladım siz csv de kullanabilirsiniz. Hatta kısayol ve makrolarınızı csv dosylarına yazıp oradan da çekebilirsiniz, geliştirimek size kalmış.

1 Beğeni

Merhaba hocam. Sizler mesaj atana kadar aslında butonlarla ilgili sorunumu çözdüm. Yine de çok teşekkür ederim.

Ben sadece sqlite veri tabanı bildiğim için kullanmıştım fakat kullandığınız yöntem de bayağı işi kolaylaştırıyormuş. Birdahaki uygulamada kullanabilirim.

Yazdığınız kodları inceledim. Sizin yazdığınızın yanında ben kendi yazdığımı koysam yüksek ihtimalle bende birçok hata çıkar.