Реализация кнопки Kivy - как я могу сделать это с моим написанным кодом? - PullRequest
0 голосов
/ 13 ноября 2018

Я новичок в программировании на python и kivy, и чтобы узнать немного больше, я попытался создать небольшой музыкальный проигрыватель - он воспроизводит звук, если я выбираю из списка рядом с панелью - но я не могу этого получитьСама панель для работы - мне нужно какое-то объяснение, как этого добиться, и предметы similair не очень полезны.Я пытался заставить работать ровно 4 кнопки в макете ручки - но безрезультатно. Вот мой код в python \ kivy:

import kivy
kivy.require('1.10.0')
from kivy.config import Config
Config.set('graphics', 'fullscreen', '0')

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.popup import Popup
from kivy.uix.button import Button
from kivy.uix.widget import Widget
from kivy.core.audio import SoundLoader
from kivy.uix.gridlayout import GridLayout
from kivy.properties import ObjectProperty
from kivy.uix.floatlayout import FloatLayout
from os import listdir, path

Builder.load_file("views/theme.kv")

class Player(Widget):
    directory = "" #directory path;
    currentlyplaying = "" #now playing song;

    def Gettrack_path(self):
        try:
            track = open("path/path.dat", "r")
            self.ids.direct.text = str(track.readline())
            track.close()
            self.ids.searchBtn.text = "Search"
            self.load_tracks()
        except:
           self.ids.direct.text = ''

    def Savetrack_path(self, path):
        track = open("path/path.dat", "w")
        track.write(path)
        track.close()

    def select(self, path):
        self.directory = path
        self.ids.direct.text - self.directory
        self.ids.searchBtn.text = "Search tracks"
        self.Savetrack_path(self.directory)
        self.load_tracks()

    def load_tracks(self):
        tracks = []
        self.directory = self.ids.direct.text
        if not self.directory.endswith("/"):
            self.directory += "/"

        if not path.exists(self.directory):
            self.ids.status.text = "Given path doesn't exist"
            self.ids.status.color = (1,0,0,1)
        else:
            self.ids.status.text = ""
            self.ids.scroll.bind(minimum_height = self.ids.scroll.setter("height"))

        for file in listdir(self.directory):
            if file.endswith(".mp3") or file.endswith(".wav") or file.endswith(".aiff") or file.endswith(".aac") or file.endswith(".ogg") or file.endswith(".mp4") or file.endswith(".wma"):
                tracks.append(file)
        if tracks == [] and self.directory != "":
            self.ids.status.text = "No tracks found"
            self.ids.status.color = (1,0,0,1)
        if self.directory == "/" or self.directory == "":
            try:
                self.ids.status.text = "No tracks found - given path doesn't exist"
                self.ids.status.color = (1,0,0,1)
            except:
                self.ids.status.text ="Error loading path"
                self.ids.status.color = (1,0,0,1)
                self.directory = "/"
        tracks.sort()

        for track in tracks:
            def playTrack(bt):
                try:
                    self.currentlyplaying.stop()
                except:
                    pass
                finally:
                    if track.endswith(".mp3"): 
                        self.currentlyplaying = SoundLoader.load(self.directory+bt.text+'.mp3')
                        self.currentlyplaying.play()
                        self.ids.nowplay.text = bt.text
                    if track.endswith(".wav"):
                        self.currentlyplaying = SoundLoader.load(self.directory+bt.text+'.wav')
                        self.currentlyplaying.play()
                        self.ids.nowplay.text = bt.text
                    if track.endswith(".aiff"):
                        self.currentlyplaying = SoundLoader.load(self.directory+bt.text+'.aiff')
                        self.currentlyplaying.play()
                        self.ids.nowplay.text = bt.text
                    if track.endswith(".aac"):
                        self.currentlyplaying = SoundLoader.load(self.directory+bt.text+'.aac')
                        self.currentlyplaying.play()
                        self.ids.nowplay.text = bt.text
                    if track.endswith(".ogg"):
                        self.currentlyplaying = SoundLoader.load(self.directory+bt.text+'.ogg')
                        self.currentlyplaying.play()
                        self.ids.nowplay.text = bt.text
                    if track.endswith(".mp4"):
                        self.currentlyplaying = SoundLoader.load(self.directory+bt.text+'.mp4')
                        self.currentlyplaying.play()
                        self.ids.nowplay.text = bt.text
                    if track.endswith(".wma"):
                        self.currentlyplaying = SoundLoader.load(self.directory+bt.text+'.wma')
                        self.currentlyplaying.play()
                        self.ids.nowplay.text = bt.text

            btn = Button(text = track[:-4], on_press = playTrack)
            self.ids.scroll.add_widget(btn)
            if tracks.index(track) % 2 == 0:
                btn.background_color = (88, 44, 234, 0.6)
            else:
                btn.background_color = (37, 44, 249, 0.6)
            self.soundplayer(*tracks)
        def soundplayer(sound):
            if self.ids.play.state == "down":
                playsound = SoundLoader.load(sound)
                playsound.play()



class PyPlayer(App):
    def build(self):
        player = Player()
        player.Gettrack_path()
        return player   
PyPlayer().run()

И есть файл .kv

    #:kivy 1.10
<Player>:

    canvas.before:
        Color:
            rgba: 0,0,0,1
        Rectangle:
            pos: self.pos
            size: self.size

    TextInput:
        id: direct
        pos: 0,root.top-35
        size: (root.width * 0.3),35
        hint_text: 'Browse'

    Button:
        id: searchBtn
        size: (root.width * 0.1),36
        background_color: 1, 0, 0, 22
        pos: root.width * 0.3, root.top-35
        on_release: root.load_tracks()

    ScrollView:
        size_hint: None, None
        size: (root.width *0.4), root.height - 45
        pos: 0, 0
        GridLayout:
            id: scroll
            cols: 1
            spacing: 10
            size_hint_y: None
            row_force_default: True
            row_default_height: 40

    GridLayout:
        rows: 1
        pos: (root.width * 0.4), root.height - 135
        size: (root.width * 0.6), 50
        Button:
            id:previous
            background_color: 0, 0, 0, 1
            Image:
                source: "backward.png"  
                y: self.parent.y + self.parent.height - 75
                x: self.parent.x + 10
                size: self.size
        Button:
            id:pause
            background_color: 0, 0, 0, 1
            Image:
                source: "pause.png"
                y: self.parent.y + self.parent.height - 75
                x: self.parent.x + 10
                size: self.size
        Button:
            id:play
            on_press: root.soundplayer()
            background_color: 0, 0, 0, 1
            Image:
                source: "play.png"
                y: self.parent.y + self.parent.height - 75
                x: self.parent.x + 10
                size: self.size

        Button:
            id:forward
            background_color: 0, 0, 0, 1

            Image:
                source: "forward.png"
                y: self.parent.y + self.parent.height - 75
                x: self.parent.x + 10
                size: self.size
    Button:
        id: nowplay
        text: 'Currently Playing'
        pos: (root.width * 0.4),root.height - 85
        size: (root.width * 0.6), 50
        background_color: 0, 0, 0, 0

    Label:
        id: status
        text: ''
        pos: root.width * 0.15, root.top * 0.5

Это мой первый вопрос, пожалуйста, ребята, поймите, что у меня еще нет опыта

1 Ответ

0 голосов
/ 27 ноября 2018

Это заняло не так много времени, но я забыл опубликовать свой код - может быть, кто-то узнает или повторно использует мой ответ в собственном проекте:

import kivy
kivy.require('1.10.0')
from kivy.config import Config
Config.set('graphics', 'fullscreen', '0')

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.popup import Popup
from kivy.uix.button import Button
from kivy.uix.widget import Widget
from kivy.core.audio import SoundLoader
from kivy.uix.gridlayout import GridLayout
from kivy.properties import ObjectProperty
from kivy.properties import NumericProperty
from kivy.uix.slider import Slider
from os import listdir, path

Builder.load_file("views/theme.kv")

class Player(Widget):
    directory = "" #directory path;
    currentlyplaying = "" #now playing song;
    position = 0
    volume = 0
    maxvolume = NumericProperty(1.0)
    tracks = []
    def Gettrack_path(self):
        try:
            track = open("path/path.dat", "r")
            self.ids.direct.text = str(track.readline())
            track.close()
            self.ids.searchBtn.text = "Search"
            self.load_tracks()
        except:
           self.ids.direct.text = ''

    def Savetrack_path(self, path):
        track = open("path/path.dat", "w")
        track.write(path)
        track.close()

    def load_tracks(self):
        self.directory = self.ids.direct.text
        if not self.directory.endswith("\\"):
            self.directory += "\\"

        if not path.exists(self.directory):
            self.ids.status.text = "Given path doesn't exist"
            self.ids.status.color = (1,0,0,1)
        else:
            self.ids.status.text = ""
            self.ids.scroll.bind(minimum_height = self.ids.scroll.setter("height"))

        for file in listdir(self.directory):
            if file.endswith(".mp3") or file.endswith(".wav") or file.endswith(".aiff") or file.endswith(".aac") or file.endswith(".ogg") or file.endswith(".mp4") or file.endswith(".wma"):
                self.tracks.append(file)
        if self.tracks == [] and self.directory != "":
            self.ids.status.text = "No tracks found"
            self.ids.status.color = (1,0,0,1)
        if self.directory == "\\" or self.directory == "":
            try:
                self.ids.status.text = "No tracks found - given path doesn't exist"
                self.ids.status.color = (1,0,0,1)
            except:
                self.ids.status.text ="Error loading path"
                self.ids.status.color = (1,0,0,1)
                self.directory = "\\"
        self.tracks.sort()
        for track in self.tracks:
            def playTrack(bt):
                try:
                    self.currentlyplaying.stop()
                except:
                    pass
                finally:
                    if track.endswith(".mp3"): 
                        self.currentlyplaying = SoundLoader.load(self.directory+bt.text+'.mp3')
                        self.currentlyplaying.play()
                        self.currentlyplaying.volume = self.volume
                        self.ids.nowplay.text = bt.text+'.mp3'
                    if track.endswith(".wav"):
                        self.currentlyplaying = SoundLoader.load(self.directory+bt.text+'.wav')
                        self.currentlyplaying.play()
                        self.currentlyplaying.volume = self.volume
                        self.ids.nowplay.text = bt.text+'.wav'
                    if track.endswith(".aiff"):
                        self.currentlyplaying = SoundLoader.load(self.directory+bt.text+'.aiff')
                        self.currentlyplaying.play()
                        self.currentlyplaying.volume = self.volume
                        self.ids.nowplay.text = bt.text+'.aiff'
                    if track.endswith(".aac"):
                        self.currentlyplaying = SoundLoader.load(self.directory+bt.text+'.aac')
                        self.currentlyplaying.play()
                        self.currentlyplaying.volume = self.volume
                        self.ids.nowplay.text = bt.text+'.aac'
                    if track.endswith(".ogg"):
                        self.currentlyplaying = SoundLoader.load(self.directory+bt.text+'.ogg')
                        self.currentlyplaying.play()
                        self.currentlyplaying.volume = self.volume
                        self.ids.nowplay.text = bt.text+'.ogg'
                    if track.endswith(".mp4"):
                        self.currentlyplaying = SoundLoader.load(self.directory+bt.text+'.mp4')
                        self.currentlyplaying.play()
                        self.currentlyplaying.volume = self.volume
                        self.ids.nowplay.text = bt.text+'.mp4'
                    if track.endswith(".wma"):
                        self.currentlyplaying = SoundLoader.load(self.directory+bt.text+'.wma')
                        self.currentlyplaying.play()
                        self.currentlyplaying.volume = self.volume
                        self.ids.nowplay.text = bt.text+'.wma'

            btn = Button(text = track[:-4], on_press = playTrack)
            self.ids.scroll.add_widget(btn)
            if self.tracks.index(track) % 2 == 0:
                btn.background_color = (88, 44, 234, 0.6)
            else:
                btn.background_color = (37, 44, 249, 0.6)
    def pause(self):
        if self.ids.pause.state == "down":
            if self.currentlyplaying == "":
                pass
            else:
                self.position = self.currentlyplaying.get_pos()
                self.currentlyplaying.stop()
    def play(self):
        if self.ids.play.state == "down":
            if self.currentlyplaying == "":
                pass
            if self.currentlyplaying.state == "stop":
                self.currentlyplaying.play()
                self.currentlyplaying.volume = self.volume
                self.currentlyplaying.seek(self.position - 1)
            if self.currentlyplaying.state =="play":
                pass
    def next(self):
        if self.ids.forward.state == "down":
            if self.currentlyplaying == "":
                pass
            i = 0
            while(i < len(self.tracks)):
                if self.currentlyplaying.filename == self.directory + self.tracks[i]:
                    self.currentlyplaying.stop()
                    self.currentlyplaying = SoundLoader.load(self.directory + self.tracks[i+1])
                    self.ids.nowplay.text = self.tracks[i+1]
                    self.currentlyplaying.play()
                    self.currentlyplaying.volume = self.volume
                    break
                elif self.currentlyplaying.filename == self.directory + self.tracks[-1]:
                    self.currentlyplaying.stop()
                    self.currentlyplaying = SoundLoader.load(self.directory + self.tracks[0])
                    self.ids.nowplay.text = self.tracks[0]
                    self.currentlyplaying.play()
                    self.currentlyplaying.volume = self.volume
                    break
                i += 1
    def previous(self):
        if self.ids.previous.state == "down":
            if self.currentlyplaying == "":
                pass
            i = 0
        while(i < len(self.tracks)):
                if self.currentlyplaying.filename == self.directory + self.tracks[i]:
                    self.currentlyplaying.stop()
                    self.currentlyplaying = SoundLoader.load(self.directory + self.tracks[i-1])
                    self.ids.nowplay.text = self.tracks[i-1]
                    self.currentlyplaying.play()
                    self.currentlyplaying.volume = self.volume
                    break
                elif self.currentlyplaying.filename == self.directory + self.tracks[0]:
                    self.currentlyplaying.stop()
                    self.currentlyplaying = SoundLoader.load(self.directory + self.tracks[-1])
                    self.ids.nowplay.text = self.tracks[-1]
                    self.currentlyplaying.play()
                    self.currentlyplaying.volume = self.volume
                    break
                i += 1

    def volumectrl(self, *args):
        self.volume = int(args[1]) / 100
        if self.volume >= int(self.maxvolume):
            self.volume = int(self.maxvolume)
        self.currentlyplaying.volume = self.volume


class PyPlayer(App):
    def build(self):
        player = Player()
        player.Gettrack_path()
        return player   
PyPlayer().run()

И, конечно, файл .kv:

#:kivy 1.10
<Player>:
    orientation: "horizontal"
    canvas.before:
        Rectangle:
            pos: self.pos
            size: self.size
            source: "264727.jpg"


    TextInput:
        id: direct
        pos: 0,root.top-35
        size: (root.width * 0.3),35
        hint_text: 'balk is empty'

    Button:
        id: searchBtn
        size: (root.width * 0.1),36
        background_color: 1, 0, 0, 22
        pos: root.width * 0.3, root.top-35
        on_release: root.load_tracks()

    ScrollView:
        size_hint: None, None
        size: (root.width *0.4), root.height - 45
        pos: 0, 0
        GridLayout:
            id: scroll
            cols: 1
            spacing: 10
            size_hint_y: None
            row_force_default: True
            row_default_height: 40

    GridLayout:
        rows: 1
        pos: (root.width * 0.4), root.height - 135
        size: (root.width * 0.6), 50
        Button:
            id:previous
            background_color: 0, 0, 0, 0
            on_press: root.previous()
            Image:
                source: "backward.png"  
                y: self.parent.y + self.parent.height - 75
                x: self.parent.x + 10
                size: self.size
        Button:
            id:pause
            on_press: root.pause()
            background_color: 0, 0, 0, 0
            Image:
                source: "pause.png"
                y: self.parent.y + self.parent.height - 75
                x: self.parent.x + 10
                size: self.size
        Button:
            id:play
            on_press: root.play()
            background_color: 0, 0, 0, 0
            Image:
                source: "play.png"
                y: self.parent.y + self.parent.height - 75
                x: self.parent.x + 10
                size: self.size

        Button:
            on_press: root.next()  
            id:forward
            background_color: 0, 0, 0, 0
            Image:
                source: "forward.png"
                y: self.parent.y + self.parent.height - 75
                x: self.parent.x + 10
                size: self.size
    Slider:
        id:volumecontrol
        size_hint_y: 0.1
        pos: (root.width * 0.4), root.height - 200
        size: (root.width * 0.6) - 15, 50
        max: 100
        min: 0
        on_value:root.volumectrl(*args)

    Button:
        id: nowplay
        text: 'Currently Playing'
        pos: (root.width * 0.4),root.height - 85
        size: (root.width * 0.6), 50
        background_color: 0, 0, 0, 0

    Label:
        id: status
        text: ''
        pos: root.width * 0.15, root.top * 0.5

Что я изменил - сначала я заменяю список своих треков на класс головы - это делает его доступным для всех функций и позволяет писать функции для всех кнопок в моем небольшом интерфейсе - я использовал в файле kvссылка на фоновое изображение, что делает его немного красивее, и в качестве бонуса я написал функцию регулировки громкости и создал для нее панель для постоянного чтения значения в диапазоне от 0 до 100

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...