繁体   English   中英

Kivy按钮实现-如何用我的书面代码做到这一点?

[英]Kivy button implementation - how can I do that with my written code?

我是python和kivy编程的新手,要了解更多信息,我尝试制作一个小型音乐播放器-如果我从窗格旁边的列表列表中进行选择,它将播放声音-但我无法将该窗格本身工作-我需要一些解释说明如何实现这一目标,而类似主题并不是很有帮助。 我试图在握点布局中使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

这是我的第一个问题,所以请大家明白我还没有经验

花费了很长时间,但我忘了发布代码-也许有人会在自己的项目中学习或重用我的答案:

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

我做了什么更改-首先,我将曲目列表替换为head类-这样就可以使用所有功能,并可以将功能写入小界面中的所有按钮-我在kv文件中使用了指向背景的链接image是什么使它更漂亮,并且作为奖励,我编写了一个音量控制功能,并创建了一个条形图,使其可以不断读取该值,无论该值在0到100之间

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM