[REHBER] AMS 9.1 ile Gelişmiş Sistem Bilgisi (AIO) Projesi Yapımı​

Merhaba uydudoktoru.com ailesi,

Bugün AutoPlay Media Studio (AMS) 9.1 sürümünde, bilgisayarın donanım kimliğini (CPU, RAM, Anakart, GPU) anlık olarak çekip ekrana yazdıran profesyonel bir AIO arayüzü hazırlıyoruz. Bu yöntemle teknik servis işlerinizde veya kişisel projelerinizde PC özelliklerini tek tıkla görebileceksiniz.

Kodları Nereye Yazacağız? (Uygulama Adımları)​

Birçok arkadaşımız kodun nereye yazılacağı konusunda takılabiliyor. Adım adım gidelim:

1. Adım (Global Tanımlama):AMS programını açın. Üst menüden Project > Global Determinations kısmına girin. Açılan boş sayfaya aşağıdaki fonksiyonu yapıştırın. Bu sayede kod projenin her yerinde çalışır hale gelir.
Kod:
function GetPC_Detay()
    -- WMI üzerinden İşlemci bilgisini çekiyoruz
    sCPU = System.GetLANInfo().CPU;
    -- Bellek bilgisini çekiyoruz
    sRAM = Memory.GetSize().Total;
    -- İşletim sistemi bilgisi
    sOS = System.GetOSName();
    
    -- Çekilen verileri ekrandaki etiketlere (Label) yazdırıyoruz
    -- Not: Sayfanızda "lblCPU", "lblRAM" ve "lblOS" isimli Label objeleri olmalıdır.
    Label.SetText("lblCPU", "İşlemci: " .. sCPU);
    Label.SetText("lblRAM", "Toplam RAM: " .. Math.Round(sRAM / 1024, 2) .. " GB");
    Label.SetText("lblOS", "Sistem: " .. sOS);
end
2. Adım (Sayfa Açılışında Çalıştırma):Hazırladığınız sayfanın (Page1) boş bir yerine sağ tıklayıp Properties deyin. Actions sekmesine geçin ve On Show kısmına şu tek satırlık kodu yazın:
Kod:
GetPC_Detay();
3. Adım (Görsel Objeler):Sayfanıza 3 adet Label objesi ekleyin. Bu objelerin isimlerini (Object Name) sağ taraftaki panelden sırasıyla lblCPU, lblRAM ve lblOS yapın. Programı çalıştırdığınız anda bilgiler otomatik olarak bu alanlara dolacaktır.

Teknik İpucu​

Eğer daha detaylı bilgi (Ekran kartı seri nosu, Anakart modeli vb.) çekmek isterseniz AMS 9.1'in WMI Plugin desteğini kullanmanızı öneririm. Bu sayede donanım tabanlı her türlü veriye erişebilirsiniz.
 
1774433138947.webp
Project + Global Fuctions Kodu giriniz.
1774433462076.webp
Kod:
function WMI_Bilgi_Cek(komut, anahtar)
    local tempDosya = _TempFolder .. "\\wmi_ham.txt"
    local temizDosya = _TempFolder .. "\\wmi_temiz.txt"
    local sSonuc = "Okunamadi"
    
    -- 1. Ham veriyi dosyaya yaz
    os.execute("wmic " .. komut .. " /value > \"" .. tempDosya .. "\"")
    
    -- 2. Veriyi ANSI formatina cevir (Okunabilirlik için şart)
    os.execute("type \"" .. tempDosya .. "\" > \"" .. temizDosya .. "\"")
    
    local f = io.open(temizDosya, "r")
    if f then
        local icerik = f:read("*all")
        f:close()
        -- Anahtarı bul ve degeri ayıkla
        for line in string.gmatch(icerik, anahtar .. "=([^\r\n]+)") do
            sSonuc = line:match("^%s*(.-)%s*$") -- Boşlukları temizle
            break
        end
    end
    
    os.remove(tempDosya)
    os.remove(temizDosya)
    return sSonuc
end
Pages üzerine çift tıkla ana sablon üzeri oluyor Page1 Script gel oradan On Show tıkla ve aşağıdaki kodu giriniz
1774433579316.webp
Kod:
-- 1. BAŞLANGIÇ: Ayrı bir pencere (Status Dialog) açıyoruz
StatusDlg.Show(MB_ICONNONE, false);
StatusDlg.SetTitle("uydudoktoru.com");
StatusDlg.SetMessage("Sistem bilgileri taranıyor, lütfen bekleyiniz...");

-- 2. VERİ ÇEKME İŞLEMLERİ (Senin mevcut kodların)
sCPU = WMI_Bilgi_Cek("cpu get name", "Name");
Label.SetText("SONUC_2", "Islemci: " .. sCPU);

sGPU = WMI_Bilgi_Cek("path Win32_VideoController get Name", "Name");
Label.SetText("SONUC_GPU", "Ekran Karti: " .. sGPU);

sBoard = WMI_Bilgi_Cek("baseboard get Product", "Product");
Label.SetText("SONUC_BOARD", "Anakart: " .. sBoard);

sRawRAM = WMI_Bilgi_Cek("ComputerSystem get TotalPhysicalMemory", "TotalPhysicalMemory");

-- 3. BİTİŞ: Pencereyi kapat ve sonucu yazdır
StatusDlg.Hide();

if (sRawRAM ~= "Okunamadi") then
    nRAM_GB = Math.Round(tonumber(sRawRAM) / (1024 * 1024 * 1024), 0);
    Label.SetText("SONUC_RAM", "Toplam RAM: " .. nRAM_GB .. " GB | uydudoktoru.com");
else
    Label.SetText("SONUC_RAM", "RAM Okunamadi | uydudoktoru.com");
end
3 adet Label seçiniz
1774433702135.webp
Labellere resimde gözüktüğü gibi
SONUC_RAM
SONUC_BOARD
SONUC_GPU Yazınız
Sonuç
1774433849068.webp
daha geliştirebilirsiniz.
 

Eklentiler

Emeğinize sağlık hocam.

Linux tarafında çok kolay bunlar;)

Millet dalga geçer gibi altından girip üstünden çıkıyor tema falan ekliyor.

Örnek, sistem yükünü ve arkaplanda çalışan threadları görüntülemek için çok ilkel bir araç:
1774466833149.webp

Bunun modern versiyonları da var çeşit çeşit. Geçenlerde bir arkadaş çok güzel bir uygulama yapmıştı bulabilirsem başlık açıp paylaşırım.
 
Buldum. Linux için detaylı PC özellikleri gösteren program:

1774468371050.webp

Kod:


Python:
import gi
import subprocess
import os
import threading
import re

gi.require_version('Gtk', '4.0')
gi.require_version('Adw', '1')
from gi.repository import Gtk, Adw, Gdk, GLib, Pango

class InxiSadePanel(Adw.Application):
    def __init__(self):
        super().__init__(application_id='com.debian.inxi.final')
        self.aktif_buton = None

    def do_activate(self):
        self.win = Adw.ApplicationWindow(application=self)
        self.win.set_title("Sistem Bilgi Merkezi (Professional Dark)")

        width, height = 1050, 750
        self.win.set_default_size(width, height)

        # CSS ile Koyu Speccy Teması ve Seçili Buton Stili
        style_provider = Gtk.CssProvider()
        css_data = """
            .sidebar {
                background-color: #1e1e1e;
                border-right: 1px solid #111111;
            }
            .sidebar button {
                color: #cccccc;
                margin: 2px 8px;
                padding: 10px;
                border-radius: 4px;
                font-family: 'Liberation Sans', sans-serif;
                font-size: 10pt;
            }
            .sidebar button:hover {
                background-color: #333333;
                color: #ffffff;
            }
            /* Seçili buton (aktif kategori) stili */
            .sidebar button.suggested-action {
                background-color: #000000;
                color: #ffffff;
                font-weight: bold;
                border: 1px solid #3498db;
            }
            .report-area {
                background-color: #252525;
                color: #e0e0e0;
                font-family: 'Liberation Sans', sans-serif;
                font-size: 11pt;
            }
            .header-label {
                font-weight: bold;
                font-size: 13px;
                color: #555555;
                margin-left: 15px;
                text-transform: uppercase;
                letter-spacing: 1px;
            }
            scrolledwindow {
                background-color: #252525;
            }
        """
        style_provider.load_from_data(css_data.encode('utf-8'))
        
        Gtk.StyleContext.add_provider_for_display(
            Gdk.Display.get_default(),
            style_provider,
            Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
        )

        ana_kutu = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        self.win.set_content(ana_kutu)

        header = Adw.HeaderBar()
        self.spinner = Gtk.Spinner()
        header.pack_end(self.spinner)
        ana_kutu.append(header)

        paned = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
        ana_kutu.append(paned)

        # SOL MENÜ
        self.sol_menu = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=2)
        self.sol_menu.set_size_request(250, -1)
        self.sol_menu.add_css_class("sidebar")
        paned.append(self.sol_menu)

        lbl_head = Gtk.Label(label="BİLEŞENLER")
        lbl_head.set_margin_top(25)
        lbl_head.set_margin_bottom(15)
        lbl_head.set_xalign(0)
        lbl_head.add_css_class("header-label")
        self.sol_menu.append(lbl_head)

        kategoriler = [
            (" Sistem Özeti", "-b"), (" İşlemci (CPU)", "-C"),
            ("️ Ekran Kartı (GPU)", "-G"), (" Bellek (RAM)", "-m"),
            (" Disk Bilgisi", "-D"), (" Ağ Kartları", "-N"),
            (" Ses Sistemi", "-A"), ("️ Sıcaklıklar", "-s"),
            (" Yazılım Depoları", "-r"), (" Pil Durumu", "-B"),
            (" Tam Rapor", "-F")
        ]

        for isim, param in kategoriler:
            btn = Gtk.Button(label=isim)
            btn.set_has_frame(False)
            label = btn.get_child()
            if isinstance(label, Gtk.Label):
                label.set_xalign(0)
                label.set_margin_start(10)

            btn.param = param
            btn.connect('clicked', self.on_button_clicked)
            self.sol_menu.append(btn)

            if param == "-b":
                self.vurgula_butonu(btn)

        spacer = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        spacer.set_vexpand(True)
        self.sol_menu.append(spacer)

        btn_serial = Gtk.Button(label=" Seri Numaraları")
        btn_serial.set_has_frame(False)
        btn_serial.set_margin_bottom(20)
        label_s = btn_serial.get_child()
        if isinstance(label_s, Gtk.Label):
            label_s.set_xalign(0)
            label_s.set_margin_start(10)
        btn_serial.connect('clicked', self.on_serial_clicked)
        self.sol_menu.append(btn_serial)

        # SAĞ PANEL
        vbox_sag = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        vbox_sag.set_hexpand(True)
        paned.append(vbox_sag)

        scrolled = Gtk.ScrolledWindow()
        scrolled.set_vexpand(True)
        
        self.metin_alani = Gtk.TextView(editable=False)
        self.metin_alani.add_css_class("report-area")
        self.metin_alani.set_left_margin(40)
        self.metin_alani.set_right_margin(40)
        self.metin_alani.set_top_margin(40)
        self.metin_alani.set_bottom_margin(40)
        self.metin_alani.set_wrap_mode(Gtk.WrapMode.WORD_CHAR)
        self.metin_alani.set_cursor_visible(False)
        
        self.buffer = self.metin_alani.get_buffer()
        self.buffer.create_tag("bold", weight=Pango.Weight.BOLD, foreground="#3498db")
        self.buffer.create_tag("paragraf", pixels_below_lines=15)

        scrolled.set_child(self.metin_alani)
        vbox_sag.append(scrolled)

        self.win.present()
        self.islem_baslat("-b")

    def vurgula_butonu(self, buton):
        """Önceki seçili butonu normale döndürür, yenisini koyulaştırır."""
        if self.aktif_buton:
            self.aktif_buton.remove_css_class("suggested-action")
        self.aktif_buton = buton
        self.aktif_buton.add_css_class("suggested-action")

    def on_button_clicked(self, btn):
        self.vurgula_butonu(btn)
        self.islem_baslat(btn.param)

    def on_serial_clicked(self, btn):
        self.vurgula_butonu(btn)
        self.spinner.start()
        thread = threading.Thread(target=self.arkaplan_islem_pkexec)
        thread.daemon = True
        thread.start()

    def islem_baslat(self, param):
        self.spinner.start()
        thread = threading.Thread(target=self.arkaplan_islem, args=(param,))
        thread.daemon = True
        thread.start()

    def arkaplan_islem(self, param):
        env = os.environ.copy()
        env["LC_ALL"] = "tr_TR.UTF-8"
        try:
            res = subprocess.run(['inxi', param, '-c', '0'], capture_output=True, text=True, env=env)
            cikti = res.stdout if res.stdout else "Veri alınamadı."
        except Exception as e:
            cikti = f"Hata: {str(e)}"
        GLib.idle_add(self.metni_formatli_yaz, cikti)

    def arkaplan_islem_pkexec(self):
        try:
            komut = ['pkexec', 'inxi', '-M', '-B', '-D', '-xx', '-c', '0', '-z']
            res = subprocess.run(komut, capture_output=True, text=True, env={'LC_ALL': 'tr_TR.UTF-8'})
            cikti = res.stdout
        except:
            cikti = "İşlem iptal edildi."
        GLib.idle_add(self.metni_formatli_yaz, cikti)

    def metni_formatli_yaz(self, metin):
        self.buffer.set_text("")
        satirlar = metin.split('\n')
        for satir in satirlar:
            if not satir.strip():
                continue
            match = re.match(r"^(\w+):", satir)
            iter = self.buffer.get_end_iter()
            if match:
                baslik = match.group(0)
                detay = satir[len(baslik):]
                self.buffer.insert_with_tags_by_name(iter, "\n" + baslik, "bold", "paragraf")
                iter = self.buffer.get_end_iter()
                self.buffer.insert(iter, detay + "\n")
            else:
                self.buffer.insert(iter, satir + "\n")
        self.spinner.stop()
        return False

if __name__ == "__main__":
    app = InxiSadePanel()
    app.run(None)

herhangi bir isim verilip .py uzantısıyla kaydetip terminalden

Kod:
python3 verdiğinizprogramadı.py

komutuyla çalıştırabilirsiniz.

Çalıştırmadan önce sisteminizde yoksa inxi programını kurmalısınız. Sadece Debian ya da Debian'dan türemiş (ubuntu gibi) linux sistemlerde çalışır.
 
Geri
Yukarı