Tkinter diğer bilgisayarlarda farklı görünüyor

Merhaba şuan yapmakta olduğum programın kodunu arkadaşım yazınca herşeyin yeri kayıyor nasıl çözebilirim?

Kod görmeden bir şey soylemek zor.
Ancak; pencere oluşumu, eğer ekran
çözünürlüğü ile oluşuturuluyor ise olabilir.
Bir de aynı fontlar diğer bilgisayarda var mı?

2 Beğeni

fontlar var senin dediğin gibi çözünürlükle alakalı muhtemelen çözmenin bi yolu var mı ?

How to make resizable widgets in tkinter | python programming

Bir çok yöntem var ama asıl sorunu anlamadan çözüm üretmek zor.

Yukarıkdaki örnekten faydalanmak dışında;

canvas tkinter, anchor tkiner gibi google aramalarıyla da çeşitlendirebilirsin.

Merhaba,
benzer sorunu ben de yaşıyorum.
tkinter ile arabirim oluşturuyorum.
unsurları (widget), place() ya da grid() kullanarak yerleştirmem sonucu değiştirmiyor.
Evde Linux İşletim sisteminde python 3.8.8 ve 3.9.7 sürümlerde düzgün görünen arabirim, İşyerimdeki Windows bilgisayarda ve arkadaşımın Mac’in de sorunlu görünüyor.
Windows’taki python sürümünü hatırlamıyorum, Arkadaşımın Mac 'in de Python 3.10.4 sürümü yüklü.
Python sürümlerinde kaynaklı bir problem olabilir mi?
Gerçi öyle olsa, uygulamayı yükleyecek kişilerin aynı python sürümüne sahip olması gerekir ki, bu pek mantıklı gelmiyor bana.

Linux’taki Görüntü:

MacOS’taki görüntü;

Windows’taki görüntü;

# -*- coding: utf-8 -*-

import tkinter as tk
import tkinter.ttk as ttk
from tkinter import END, messagebox

#Fonksiyonlar

def ara():
    
    cikti.delete("1.0",tk.END)

    with open("Kelime_Listesi.txt", "r", encoding="UTF-8") as dosya:
        liste = dosya.readlines()
        alfabe = "abcçdefgğhıijklmnoöprsştuüvyz"     

        for harf in girdi.get().lower():
            if harf not in alfabe:
                messagebox.showerror("Hatalı Karakter!","İzin verilen karakterlerin dışında bir veya daha fazla karakter yazdığınız için, işleme devam edilemiyor!\nKullanılabilir karakterler şunlardır:\nabcçdefgğhıijklmnoöprsştuüvyz")
                girdi.delete(0, tk.END)
                sonuc["text"] = ""
                break

            
            else:
                deger = 0
                aranan = girdi.get().lower()
                
                for kelime in liste:
                    for harf in aranan:
                        if harf in kelime[:-1]:
                            deger += 1
                    
                    if deger == len(aranan):
                        icerik = cikti.get("1.0", END)
                        if kelime not in icerik:
                            cikti.insert(END,kelime)

                    deger = 0
                
                if (int(cikti.index("end")[:-2]) - 2 == 0):
                    sonuc["text"] = "Sonuç bulunamadı."

                else:
                    sonuc_sayi = int(cikti.index("end")[:-2])    
                    sonuc["text"] = "Toplam " + str(sonuc_sayi - 2) + " sonuç bulundu."
                    btn_kaydet.configure(state = "normal")

def kaydet():
    sonuc = int(cikti.index("end")[:-2]) - 2
    if sonuc > 0:
        with open("sonuc.txt", "w", encoding="UTF-8") as dosya:
            bulunan_kelime = str(int(cikti.index("end")[:-2]) - 2)
            dosya.write("'" + girdi.get() + "' Karakterlerini barındıran kelime araması sonucu " + bulunan_kelime + " adet sonuç bulunmuştur.\nArama sonucu bulunan kelimeler, aşağıda listelenmiştir.\n\n" + cikti.get("1.0","end"))
    else:
        messagebox.showinfo("Kaydedilecek Veri Yok!","Arama işlemi başlatılmadığı ya da arama sonucunda kelime bulunamadığı için, kayıt işlemi gerçekleştirilemiyor.")


def temizle():
    girdi.delete(0, tk.END)
    cikti.delete("1.0",tk.END)
    sonuc["text"] = ""
    btn_kaydet.configure(state = "disabled")

def pencere_hakkinda():     # "Hakkında" Penceresinin Özellikleri ve Metni                      
    hakkinda = tk.Toplevel()
    hakkinda.title("Hakkında")
    hakkinda.geometry("300x125")
    hakkinda.resizable("FALSE", "FALSE")
    bilgi = tk.Label(hakkinda, text="\nKelime Bul, Listele ve Kaydet\n[ Tkinter - place() Yerleşimi ]\n\nKodlayan: Mustafa Halil\n\nhttps://github.com/mhalil\n")
    bilgi.pack()

    
# Pencere Ebatları ve Renk Tanımları
arkaplan_rengi = "#17a589"
arkaplan_rengi_metin = "#d1f2eb"
arkaplan_rengi_buton = "#17a589"

pencere = tk.Tk()
pencere.geometry("300x450+600+300")
pencere.resizable("FALSE", "FALSE")
pencere.title(".:: Kelime Bul ::.")
pencere.configure(bg = arkaplan_rengi)

# Arayüz Unsurlarının (Widget) Yerleşimi

menu_cubugu = tk.Menu(pencere, activebackground="#17a589",activeforeground="white")
pencere.config(menu=menu_cubugu) #menümüzü oluşturduk

dosya_menusu = tk.Menu(menu_cubugu)
menu_cubugu.add_cascade(label="Dosya", menu=dosya_menusu)
dosya_menusu.add_command(label="Ara", command=ara)
dosya_menusu.add_command(label="Temizle", command=temizle)
dosya_menusu.add_command(label="Kaydet", command=kaydet)
dosya_menusu.add_command(label="Kapat", command=pencere.quit, accelerator= "Ctrl+Q")

pencere.bind_all("<Control-q>", exit)
pencere.bind_all("<Control-Q>", exit)

hakkinda_menusu = tk.Menu(menu_cubugu, tearoff=0)
menu_cubugu.add_cascade(label="Hakkında", menu=hakkinda_menusu)
hakkinda_menusu.add_command(label="Hakkında", command=pencere_hakkinda)   

aciklama = tk.Label(pencere, text = "Aradığınız kelimeye ait harfleri,\naralarında boşluk bırakmadan \naşağıdaki kutuya  yazın. Ör. trky",
                    fg = "white",
                    bg = arkaplan_rengi,
                    font = "Verdana,Tahoma,DejaVuSans,LiberationSans,Ubuntu 11",
                    width=32)
aciklama.place(x=4, y=10)

girdi = tk.Entry(pencere, 
                width=34,
                bg = arkaplan_rengi_metin)
girdi.place(x=10, y=80)

cikti = tk.Text(pencere,
                width=34,
                height=14,
                state="normal",
                bg = arkaplan_rengi_metin)
cikti.place(x=10, y=110)

sonuc = tk.Label(pencere,
                text = "",
                font = "Verdana,Tahoma,DejaVuSans,LiberationSans,Ubuntu 10 bold",
                fg = "white",
                bg = arkaplan_rengi)
sonuc.place(x=10, y= 357)                

btn_genisligi = 12

btn_ara = tk.Button(pencere,
                    text = "Ara",
                    width = btn_genisligi,
                    font = "Verdana,Tahoma,DejaVuSans,LiberationSans,Ubuntu 10 bold",
                    # bg = arkaplan_rengi_buton,
                    # fg = "white",
                    command= ara)
btn_ara.place(x=10, y=380)

btn_temizle = tk.Button(pencere,
                    text = "Temizle",
                    width = btn_genisligi,
                    font = "Verdana,Tahoma,DejaVuSans,LiberationSans,Ubuntu 10 bold",
                    # bg = arkaplan_rengi_buton,
                    # fg = "white",
                    command= temizle)
btn_temizle.place(x=150, y=380)


btn_kaydet = tk.Button(pencere,
                    text = "Kaydet",
                    width = btn_genisligi,
                    font = "Verdana,Tahoma,DejaVuSans,LiberationSans,Ubuntu 10 bold",
                    # bg = arkaplan_rengi_buton,
                    # fg = "white",
                    state = "disable",
                    command= kaydet)
btn_kaydet.place(x=10, y=415)

btn_kapat = tk.Button(pencere,
                    text = "Kapat",
                    width = btn_genisligi,
                    font = "Verdana,Tahoma,DejaVuSans,LiberationSans,Ubuntu 10 bold",
                    # bg = "#cd6155",
                    # fg = "white",
                    command=quit)
btn_kapat.place(x=150, y=415)

pencere.mainloop()

Uygulamanın GitHub Adresi;

font = “Verdana,Tahoma,DejaVuSans,LiberationSans,Ubuntu 10 bold”,

windowsta ubuntu 10 bold gibi bir font olmayabilir mi?

İki seçenek ya bu fontları da diğer bilgisayara yüklemelisin, yada windows ve mac lerde de bulunan standart bir fontu kullanmalısın gibi geliyor aklıma.

Göz ucuyla baktım, kodu denemedim.

Aslında kodu bir ara değiştirdim,
denemeleri yaptığımda kod içerisinde sadece 1 yaztipi vardı. (verdana ya da tahoma)

Bir tanesini hariç hepsini verdana yaptım.

txt dosyası da yoktu ben uydurdum.

Görüntü bu.

Mesela kapat senin kodladığın gibi bıraktım diğerleri sadece verdana.

İşletim sistemlerinden kaynaklı ufak farklılıklar oluşabilir ama asıl sorun fontlar olabilir.

Yani, renk ve font seçimlerinde olabildiğince üç işletim sisteminin de ortak değerlerini seçmezsen farklılıklar olması normal.

Edit: Foregraund ve background renklerini de dikkaltli seçmelisin.

1 Beğeni

Teşekkürler.
txt Dosyasına GitHub adresinden erişebilirsiniz.

Ben teşekkür ederim.

Kendim uydurdum kodu görünce bir metin dosyası.

Gayet iyi sonuçlar çıkmış yine de.

Dediğim gibi, işletim sistemlerinin üçünde de ortak olan değerler seçebilirseniz daha az sorun çıkar diye düşünüyorum.

Aklıma bir de işletim sistemi alıp ona göre arayüz ayarı yapabileceğiniz de geliyor.

eğer mac ise şu değerleri, windows ise bu değerleri gibi koşullu değerler oluşturabilirsiniz.

yani:

import os
isletim_sistemi = os.name


if (isletim_sistemi == "nt") : # windows için ben de nt görünüyor.
   font1 = "verdana"
if (isletim_sistemi == "linux") :
   font1 =" ubuntu"

Gibi bir düzenleme yapabilirsin.

Kod örnektir çalışacağını garanti edemem.

Ama bunu, hem koyduğun her kompenenti ölçülendirirken, her fontu seçerken yapman gerekebilir.

CrossPlatform Tkinter kullanımı biraz fazla dikkat gerektiriyor.

Sonuçta üç işletim sisteminin de huyu suyu farklı.

İlginiz için çok teşekkürler.

Kivy’de bu tür bir sorun yaşar mıyım? bilginiz var mı?
tkinter’den sonra Kivy ile de ilgilenmek istiyorum.

Bu bir sorun değil aslında, evet hangi gui kullanırsanız kullanın, dikkat etmeniz gerekir.

Sorun çapraz platform program yazarken, işletim sistemlerinin ne yaptığı ile alakalı. Sonuçta pencere başlıklarındaki buton davranışları bile farklı işletim sistemlerinin.

Belki HTML tabanlı bir arayüz kullanırsanız, aynı fontları kullanırsanız daha az sorun çıkarır ama sonuçta bir şekilde farklılıklar olacaktır.

Django, Turbogears, web.py, Pylons gibi…

Aslında bununla ilgil kitaplar dahi var,

Writing cross-platform Tkinter | Python GUI programming with Tkinter (packtpub.com)

Gibi kitaplara bakmanız gerekir. Linkteki kitap örnek, google araması ile pdf ini bulabilirsiniz belki.

Kivy de bu tarz bir sorun yaşaman pek mümkün değil ama elbette sorunlar çıkabilir. Kivy de bu tarz bir sorun yaşama ihtimalinin düşük olması kivy de boyutlandırma işlemini yüzde ile yapabiliyorsun yani genel olarak ekrana sığıyor eğer hatalı bir işlem yaptırmazsan. Yüzde ile verince bazen cihaz çok küçük veya çok büyükse bir tık kötü gözükebilir onun içinde sadece belli kısımları kivy.metrics den dp ölçü birimini kullanarak düzenleyebilirsiniz.Yani bu tarz bir sorun yaşama ihtimaliniz daha az kısaca kivy ile.

Cevaplarınız için tşekkür ederim.
Tkinter’de, Entry ve Text Widget’leri için belirlenen genişllik (width) değerleri pixel cinsinden değil, karakter sayısı cinsinden oluyormuş.
O nedenle Entry ve Text genisliklerini eşit yazar ve font ailesi belirlemezsem, uygulama her işletim sisteminde varsayılan font ile görüntüleneceği için genişlikleri eşit olacaktır diye düşünüyorum.

1 Beğeni