[英]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.