Pyhton kodunda hata tespiti

Stucknela

Kilopat
Katılım
14 Ağustos 2019
Mesajlar
492
Merhabalar.

Kod:
from tkinter import*
import time.
import keyboard.

pencere=Tk()
pencere.geometry("200x200")

def baslat():
 for x in range(3):
 time.sleep(2)
 keyboard.press("Enter")
 time.sleep(3)
 keyboard.press("2")
 time.sleep(1)
 keyboard.press("3")
 time.sleep(1)
 keyboard.press("4")
 time.sleep(2)
 keyboard.press("j")
 time.sleep(4)
 keyboard.release("j")

def durdur():
 quit()

btnbasla=Button(text="Baslat",command=baslat)
btnbasla.pack(side = LEFT,expand=10)

btndur=Button(text="Dur",command=durdur)
btndur.pack(side = LEFT,expand=10)

pencere.mainloop()

Başlattığımda başlat butonu dahi takılı kalıyor, işlemi yerine getiriyor fakat dur butonuna basamıyorum. Programı kapamıyorum, hata verip duruyor kendi kendine. Sebebi nedir sizce?
 
Son düzenleyen: Moderatör:
Öncelikle teşekkürler güzel anlatışın için.
Sublime text 3 ile yazıyorum ve fordan sonraki satır başında boşluk var burada belli olmuyor herhalde.
Öyle olmasa zaten program çalışmıyor.
Bendeki hata ise program çalışıyor fakat başla butonuna bastığımda buton dahi takılı kalıp sonrasında ne dur butonuna basabiliyorum neden programı kapatabiliyorum.
Program çalışmayı durduruyor yani.
Ben de yazdım py ama hiç böyle sorun ile karşılaşmadım. Bilgisayarın sistem özellikleri yeterli mi acaba? Bazı IDE'ler kasabiliyor çünkü.
 
Merhabalar...

Kod:
from tkinter import*
import time.
import keyboard.

pencere=Tk()
pencere.geometry("200x200")

anahtar = False.
def anahtar():
 anahtar = True.
 while anahtar:
 time.sleep(5)
 keyboard.press("Enter")
 keyboard.release("Enter")
 time.sleep(10)
 keyboard.press("2")
 time.sleep(1)
 keyboard.press("3")
 time.sleep(0.2)
 keyboard.release("3")
 time.sleep(0.2)
 keyboard.press("3")
 time.sleep(0.2)
 keyboard.release("3")
 time.sleep(13)
 keyboard.press("j")
 time.sleep(4)
 keyboard.release("j")
 time.sleep(18)

def anahtari_kapa():
 anahtar = False.

btnbasla=Button(pencere,text="Baslat",command=anahtar)
btnbasla.pack(side = LEFT,expand=10)

btndur=Button(pencere,text="Dur",command=anahtari_kapa)
btndur.pack(side = LEFT,expand=10)

pencere.mainloop()

Kodlar başlayıp döngü çalışmaya başladığında program yanıt vermiyor ve üzerine tıkladığımda çalışmayı durdurdu deyip kapanıyor.
Fakat tıklamadığım sürece sürekli while döngüsü işlevini yerine getiriyor.
Bu problemin sebebi nedir?
 
Sadece Python bildiğim için Python özelinde konuşacağım. Pythonda tk ile GUI yazarken çok sık karşılaşılan bir sorun bu. Programının yanıt vermiyor demesinin sebebini tkinter mainloop'u ile senin düğmeye basarak çalıştırdığın döngünün main thread için savaşması olarak düşünebilirsin.

TkInter bir pencere oluşturmak için ana thread üstünde bir döngü oluşturuyor ve tüm ana thread'i tamamen kendi loopu için parselliyor. Sen ana thread üzerinde sendeki for döngüsü gibi sonu gelmeyen bir şey çalıştırdığında bu sefer ana thread'i o döngün parselliyor, dolayısıyla da tkinter ana döngüsüne ana thread'de yer kalmadığından yanıt vermiyor diyor. Bunu düzeltmek için GUI yazarken arka planda yapılması gereken ana işlemleri ya ayrı bir thread içinde başlatacaksın ya da ayrı bir process içinde. Dediğim gibi bu Python'da GUI yazarken sıkça karşılaşılan bir olay.

Aşağıda attığım kod, senin başlat fonksiyonunun farklı bir thread üzerinde çalıştırılan versiyonu. Keyboard kütüphanesi yüklü olmadığı için direkt print() fonksiyonu ile göstermeye çalıştım. Bu tarz bir GUI yapacaksan öncesinde thread ve process olaylarını birazcık araştırmanı öneririm.

[CODE lang="python" title="Kod"]from tkinter import *
import time
from threading import Thread as Trd

pencere=Tk()
pencere.geometry("200x200")

def baslat():
for x in range(3):
time.sleep(2)
print('1')
time.sleep(3)
print('2')
time.sleep(1)
print('3')
time.sleep(1)
print('4')
time.sleep(2)
print('5')
time.sleep(4)
print('6')

def baslat_tread():
yeni_thread = Trd(target=baslat)
yeni_thread.start()

def durdur():
quit()

btnbasla=Button(text="Baslat",command=baslat_tread)
btnbasla.pack(side = LEFT,expand=10)

btndur=Button(text="Dur",command=durdur)
btndur.pack(side = LEFT,expand=10)

pencere.mainloop()[/CODE]
 
Taksimat senedi ve vasiyetname.
Ağıllı köymezarlığının bitişiğinde 3.5 dekar yerim var. 2 dekar bahçe, her çeşit meyve ağacı ve teşkilatlı sulama malzemesi vardır. Başında ise 2 katlı evim vardır. Bu yeri tam teşkilatlı olarak oğlum harun ve Hamza'ya verdim. 3. oğluma da bir ev yeri vermem gerekiyordu. Yine köyümüzün akyer mevkiinde 1 yerim daha var. Bu yerin güney kısmından 4 dekar yeri oğlum Mahmut'a ev yeri olarak verdim. Bu yerin hududu doğudan yeğenim Ahmet'le sınır duvarı olan kuyunun karşısındaki kayısı ağacı batıdan yine sınır komşum olan Kemal Efe'nin duvarının buna karşı çıkıntı köşesidir. Bu arada kalan 4 dekar yer köy içindeki verdiğim eve karşılıktır. Oradan miktar olarak fazla olsa bile değeri ve toprak verimi daha düşüktür. Kalan 10 dekar ise 3 kardeş arasında ortalama bölüşülecektir. Kuzeyden köy yolu geçmektedir. Bu yoldan itibaren güney taraftaki bulunan sulama kuyusu mandıra ve çoban evine yol gitmektedir. Bu yol bir metre genişliğinde olup bana aittir. Sulama kuyusunu ben açtırdım ruhsatı bana kayıtlıdır. Bu yok hem bu yerlerin hem de yeni açılacak olan evin yoludur. Çoban evini de oğlum benim için imar edip daireye dönüştürecektir. Çocuklarım bu anlaşmayı beraberce yapıp senet altına alarak imza ettiler. Bu senet dahi yanımdadır. Benden sonra çocuklarım nizaha kalmasın diye bu vasiyetnameyi düzenledim. Hiçbir baskı altında değilim. Bu senedimi şahitler huzurunda imza ederim.
Ben Hasan Hüseyin oğlu Ali özkaynak.
Şahit: Ahmet oğlu Kemal doğan şahit: Kemal oğlu Ahmet doğan.

Sadece Python bildiğim için Python özelinde konuşacağım. Python'da tk ile GUI yazarken çok sık karşılaşılan bir sorun bu. Programının yanıt vermiyor demesinin sebebini tkinter Mainloop'u ile senin düğmeye basarak çalıştırdığın döngünün main thread için savaşması olarak düşünebilirsin.

Tkınter bir pencere oluşturmak için ana thread üstünde bir döngü oluşturuyor ve tüm ana Thread'i tamamen kendi loopu için parselliyor. Sen ana thread üzerinde sendeki for döngüsü gibi sonu gelmeyen bir şey çalıştırdığında bu sefer ana Thread'i o döngün parselliyor, dolayısıyla da tkinter ana döngüsüne ana Thread'de yer kalmadığından yanıt vermiyor diyor. Bunu düzeltmek için GUI yazarken arka planda yapılması gereken ana işlemleri ya ayrı bir thread içinde başlatacaksın ya da ayrı bir process içinde. Dediğim gibi bu Python'da GUI yazarken sıkça karşılaşılan bir olay.

Aşağıda attığım kod, senin başlat fonksiyonunun farklı bir thread üzerinde çalıştırılan versiyonu. Keyboard kütüphanesi yüklü olmadığı için direkt print() fonksiyonu ile göstermeye çalıştım. Bu tarz bir GUI yapacaksan öncesinde thread ve process olaylarını birazcık araştırmanı öneririm.

[CODE lang="python" title="Kod"]from tkinter import *
import time.
from threading import Thread as Trd.

pencere=Tk()
pencere.geometry("200x200")

def baslat():
for x in range(3):
time.sleep(2)
print('1')
time.sleep(3)
print('2')
time.sleep(1)
print('3')
time.sleep(1)
print('4')
time.sleep(2)
print('5')
time.sleep(4)
print('6')

def baslat_tread():
yeni_thread = Trd(target=baslat)
yeni_thread.start()

def durdur():
quit()

btnbasla=Button(text="Baslat",command=baslat_tread)
btnbasla.pack(side = LEFT,expand=10)

btndur=Button(text="Dur",command=durdur)
btndur.pack(side = LEFT,expand=10)

pencere.mainloop()[/CODE]

Hocam hiçbir şey anlamadım ama :)
peki bu şekilde yapsam copy paste olarak bir problem çıkar mı?
Taksimat senedi ve vasiyetname.
Ağıllı köymezarlığının bitişiğinde 3.5 dekar yerim var. 2 dekar bahçe, her çeşit meyve ağacı ve teşkilatlı sulama malzemesi vardır. Başında ise 2 katlı evim vardır. Bu yeri tam teşkilatlı olarak oğlum harun ve Hamza'ya verdim. 3. oğluma da bir ev yeri vermem gerekiyordu. Yine köyümüzün akyer mevkiinde 1 yerim daha var. Bu yerin güney kısmından 4 dekar yeri oğlum Mahmut'a ev yeri olarak verdim. Bu yerin hududu doğudan yeğenim Ahmet'le sınır duvarı olan kuyunun karşısındaki kayısı ağacı batıdan yine sınır komşum olan Kemal Efe'nin duvarının buna karşı çıkıntı köşesidir. Bu arada kalan 4 dekar yer köy içindeki verdiğim eve karşılıktır. Oradan miktar olarak fazla olsa bile değeri ve toprak verimi daha düşüktür. Kalan 10 dekar ise 3 kardeş arasında ortalama bölüşülecektir. Kuzeyden köy yolu geçmektedir. Bu yoldan itibaren güney taraftaki bulunan sulama kuyusu mandıra ve çoban evine yol gitmektedir. Bu yol bir metre genişliğinde olup bana aittir. Sulama kuyusunu ben açtırdım ruhsatı bana kayıtlıdır. Bu yok hem bu yerlerin hem de yeni açılacak olan evin yoludur. Çoban evini de oğlum benim için imar edip daireye dönüştürecektir. Çocuklarım bu anlaşmayı beraberce yapıp senet altına alarak imza ettiler. Bu senet dahi yanımdadır. Benden sonra çocuklarım nizaha kalmasın diye bu vasiyetnameyi düzenledim. Hiçbir baskı altında değilim. Bu senedimi şahitler huzurunda imza ederim.
Ben Hasan Hüseyin oğlu Ali özkaynak.
Şahit: Ahmet oğlu Kemal doğan şahit: Kemal oğlu Ahmet doğan.



Hocam hiçbir şey anlamadım ama :)
peki bu şekilde yapsam copy paste olarak bir problem çıkar mı?
Birde bu programı bir pencereye endekslemek için ne yapmam gerekir ?
 

Technopat Haberler

Yeni konular

Geri
Yukarı