Merhaba,
Aşağıdaki kod satırını pyinstaller ile exe yaptığımda def indir(self): fonksiyonu çalışınca aşağıdaki hatayı alıyorum. Nerede yanlış yaptığımı bulamadım. Desteğinizi rica ediyorum.
İndirme sırasında hata oluştu: “Nonetype” object has no attribute “write” hatası alıyorum.
*** Dönüştürme esnasında konsolu gizlersem hata alıyorum. Şimdi fark ettim. Konsol açık olursa hata vermiyor.
import sys
import os
import re
import tempfile # tempfile modülünü içe aktarın
from pytube import YouTube
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog, QMessageBox, QTableWidgetItem
from PyQt5.QtCore import QTimer
from moviepy.editor import AudioFileClip
from PyQt5.uic import loadUi
class YouTubeUI(QMainWindow):
def __init__(self):
super().__init__()
# .ui dosyasını yükle
loadUi("youtube.ui", self)
# UI'ı göster
self.show()
# btn_yapistir düğmesine bağlı işlevi tanımla
self.btn_yapistir.clicked.connect(self.yapistir)
# btn_sec düğmesine bağlı işlevi tanımla
self.btn_sec.clicked.connect(self.kayit_yeri_sec)
# btn_indir düğmesine bağlı işlevi tanımla
self.btn_indir.clicked.connect(self.indir)
# btn_temizle düğmesine bağlı işlevi tanımla
self.btn_temizle.clicked.connect(self.gecmisi_temizle)
self.btn_bilgi.clicked.connect(self.show_bilgi_mesaji)
# Kayıt yeri dosyasını oku ve txt_kayityeri kutusuna yaz
self.kayit_yeri_oku()
# Geçmiş tablosunu yükle ve sütun genişliklerini ayarla
self.load_gecmis()
self.QTable_Gecmis.setColumnWidth(0, 450)
self.QTable_Gecmis.setColumnWidth(1, 110)
# QTable_Gecmis tablosuna çift tıklandığında o satırdaki şarkıyı başlat
self.QTable_Gecmis.doubleClicked.connect(self.satira_cift_tikla)
def kayit_yeri_oku(self):
try:
with open("kayit_yeri.txt", "r") as file:
kayit_yeri = file.read()
self.txt_kayityeri.setText(kayit_yeri)
except FileNotFoundError:
pass
def kayit_yeri_kaydet(self, kayit_yeri):
with open("kayit_yeri.txt", "w") as file:
file.write(kayit_yeri)
def load_gecmis(self):
try:
with open("gecmis.txt", "r") as file:
gecmis_veriler = file.readlines()
for veri in gecmis_veriler:
veri = veri.strip().split(",")
self.QTable_Gecmis.insertRow(self.QTable_Gecmis.rowCount())
self.QTable_Gecmis.setItem(self.QTable_Gecmis.rowCount()-1, 0, QTableWidgetItem(veri[0]))
self.QTable_Gecmis.setItem(self.QTable_Gecmis.rowCount()-1, 1, QTableWidgetItem(veri[1]))
except FileNotFoundError:
pass
def show_bilgi_mesaji(self):
# Bilgi mesajını göster
QMessageBox.information(self, "Bilgi-İletişim",
"Bu Program Grand14 Düğün Salonu İçin Emre AFACAN Tarafından Yazılmıştır.\n\n"
"Bütün Program İhtiyaçlarınız İçin 0539 286 88 99 nolu telefondan ulaşabilirsiniz.")
def save_gecmis(self):
try:
with open("gecmis.txt", "w") as file:
for row in range(self.QTable_Gecmis.rowCount()):
try:
file.write(f"{self.QTable_Gecmis.item(row, 0).text()},{self.QTable_Gecmis.item(row, 1).text()}\n")
except Exception as e:
print("Hata oluştu:", e)
except Exception as e:
QMessageBox.warning(self, "Hata", f"Gecmis.txt dosyasına yazılırken bir hata oluştu: {str(e)}")
def indir(self):
url = self.txt_link.text()
kayit_yeri = self.txt_kayityeri.text()
try:
# YouTube videoyu indir
video = YouTube(url)
video_stream = video.streams.filter(only_audio=True).first()
# Şarkı adını al
sarki_adi = video.title
# MP4 olarak geçici bir dosyaya kaydet
temp_mp4_yolu = os.path.join(tempfile.gettempdir(), f"{sarki_adi}.mp4")
video_stream.download(output_path=tempfile.gettempdir(), filename=f"{sarki_adi}.mp4")
# MP4 dosyasını MP3 formatına dönüştür ve yüksek bitrate ile kaydet
mp3_yolu = os.path.join(kayit_yeri, f"{sarki_adi}.mp3")
video_clip = AudioFileClip(temp_mp4_yolu)
video_clip.write_audiofile(mp3_yolu, bitrate="320k")
video_clip.close()
# Geçici MP4 dosyasını sil
os.remove(temp_mp4_yolu)
# İndirme tamamlandığında bilgi etiketini güncelle
self.lbl_bilgi.setText(f"{sarki_adi} indirildi.")
self.lbl_bilgi.setStyleSheet("color: green") # Yeşil renk
# Geçmiş tablosuna ekle
self.QTable_Gecmis.insertRow(self.QTable_Gecmis.rowCount())
self.QTable_Gecmis.setItem(self.QTable_Gecmis.rowCount()-1, 0, QTableWidgetItem(sarki_adi))
self.QTable_Gecmis.setItem(self.QTable_Gecmis.rowCount()-1, 1, QTableWidgetItem("İndirildi"))
# Geçmişi kaydet
self.save_gecmis()
# 3 saniye sonra lbl_bilgi temizlensin
QTimer.singleShot(3000, lambda: self.lbl_bilgi.clear())
except Exception as e:
QMessageBox.warning(self, "Hata", f"İndirme sırasında bir hata oluştu: {str(e)}")
def yapistir(self):
# Hafızadaki metni al
clipboard = QApplication.clipboard()
metin = clipboard.text()
# Metni kontrol et, eğer YouTube bağlantısı değilse uyarı göster
if not re.match(r"https?://(?:www\.)?youtube\.com/watch\?v=[\w-]+", metin):
QMessageBox.warning(self, "Uyarı", "Hafızadaki metin bir YouTube bağlantısı değil.")
return
# YouTube bağlantısı ise txt_link kutusuna yapıştır
self.txt_link.setText(metin)
def kayit_yeri_sec(self):
dosya_yolu = QFileDialog.getExistingDirectory(self, "Kayıt Yeri Seç")
if dosya_yolu:
self.txt_kayityeri.setText(dosya_yolu)
self.kayit_yeri_kaydet(dosya_yolu)
def gecmisi_temizle(self):
# Geçmiş tablosundaki tüm satırları kaldır
self.QTable_Gecmis.setRowCount(0)
# Kayıtları tuttuğumuz dosyayı temizle
open("gecmis.txt", "w").close()
def satira_cift_tikla(self, item):
# Çift tıklanan satırın indeksini al
row_index = item.row()
# Satırın şarkı adını ve indirme durumunu al
sarki_adi = self.QTable_Gecmis.item(row_index, 0).text()
durum = self.QTable_Gecmis.item(row_index, 1).text()
# Şarkıyı txt_kayityeri'nde belirtilen adreste bul ve başlat
dosya_yolu = self.txt_kayityeri.text()
mp3_yolu = os.path.join(dosya_yolu, f"{sarki_adi}.mp3")
if os.path.exists(mp3_yolu) and durum == "İndirildi":
os.startfile(mp3_yolu)
else:
QMessageBox.warning(self, "Uyarı", "Şarkı bulunamadı veya indirilmemiş.")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = YouTubeUI()
sys.exit(app.exec_())