Python 带文本变量的 Kivy 标签
Python Kivy Label with textvariable
我是使用 kivy 编程的新手,我的代码可能需要一些帮助。
我想做的是 运行 函数 draw_card() 并将 Screen2 中的标签文本设置为等于 draw_card 中提到的变量 some_var,当我在 screen2 中的第二个按钮被按下。
我有 3 个文件可以这样做。 main.py 包含我的 python 代码,screens.kv 包含我的 kivy 代码,appvariables.py 包含我的函数和 draw_a_card() 的字典。
有没有办法用普通的变量代替appvariables.py中的card_drawn_dict来输出我抽到的牌?
非常感谢你们。
main.py:
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen, WipeTransition
from kivy.properties import ObjectProperty, StringProperty
from kivy.uix.floatlayout import FloatLayout
from AppVariables import *
class ScreenOne(Screen):
pass
class ScreenTwo(Screen):
pass
class ScreenThree(Screen):
pass
class Manager(ScreenManager):
screen_one = ObjectProperty(None)
screen_two = ObjectProperty(None)
screen_three = ObjectProperty(None)
class ScreensApp(App):
def build(self):
m = Manager(transition=WipeTransition())
return m
def draw_card(self, *args):
draw_a_card(self, *args)
some_var = card_drawn_dict[1]
print(some_var)
screen_one.mylabel.text = some_var
if __name__ == "__main__":
ScreensApp().run()
screens.kv:
#:kivy 1.8.0
<Manager>:
id: screen_manager
screen_one: screen_one
screen_two: screen_two
screen_three: screen_three
ScreenOne:
id:screen_one
name: "Screen1"
manager: screen_manager
ScreenTwo:
id: screen_two
name: "Screen2"
manager: screen_manager
ScreenThree:
id: screen_three
name: "Screen3"
manager: screen_manager
<ScreenOne>:
Button:
text: "Start"
on_press: root.manager.current = 'Screen2'
size_hint: 0.3, 0.2
pos_hint: {"x":0.35, "y":0.2}
<ScreenTwo>:
Button:
text: "Screen 3"
on_press: root.manager.current = 'Screen3'
size_hint: 0.3, 0.2
pos_hint: {"x":0.35, "y":0.1}
Button:
text: "Karte ziehen"
on_press: app.draw_card()
size_hint: 0.3, 0.2
pos_hint: {"x":0.35, "y":0.3}
Label:
id: mylabel
text: ""
size_hint: 0.3, 0.2
pos_hint: {"x":0.35, "y":0.6}
<ScreenThree>:
Button:
text: "Screen 1"
on_press: root.manager.current = 'Screen1'
appvariables.py:
# Module: AppVariables.py
from random import randint
# Global variables
card_dict = {1:'Ace of Hearts', 2:'King of Hearts',
3:'Ace of Diamonds', 4:'King of Diamonds',
5:'Ace of Clubs', 6:'King of Clubs',
7:'Ace of Spades', 8:'King of Spades'}
card_drawn_dict = {}
# Functions
def draw_a_card(self, *args):
random_number = randint(1, 8)
if random_number in card_dict:
card_drawn = card_dict[random_number]
card_drawn_dict.update({1:card_drawn})
#print(card_drawn)
del card_dict[random_number]
else:
while not (random_number in card_dict):
if random_number == 1:
random_number = 8
else:
random_number -= 1
card_drawn = card_dict[random_number]
card_drawn_dict.update({1:card_drawn})
del card_dict[random_number]
填充Screen_Two的标签
使用self.root.screen_two.ids.mylabel.text = some_var
使用变量
一副纸牌有 52 张扑克牌,4 种花色(黑桃、红心、方块、梅花),每种花色有 13 个等级。
例子
AppVariables.py
from random import randint
# Global variables
cardSuits = ['Spades', 'Hearts', 'Diamonds', 'Clubs']
courtCards = ['Jack', 'Queen', 'King']
cardRanks = ['Ace'] + ['{}'.format(x) for x in range(2, 11)] + courtCards
cardsDrawn = []
# Functions
def draw_a_card(self, *args):
# a deck of card has 52 playing cards
if len(cardsDrawn) >= 52:
print("\tcards_drawn=", sorted(cardsDrawn))
return 'Drawn 52 cards!'
# Example set of 52 playing cards; 13 of each suit clubs, diamonds, hearts, and spades
suit = randint(1, 4)
rank = randint(1, 13)
card = '{0}-{1:02d}'.format(suit, rank)
if card not in cardsDrawn:
cardsDrawn.append(card)
return '{0} of {1}'.format(cardRanks[rank-1], cardSuits[suit-1])
else:
# recursive call
return draw_a_card(self, args)
main.py
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty
from AppVariables import *
class ScreenOne(Screen):
pass
class ScreenTwo(Screen):
pass
class ScreenThree(Screen):
pass
class Manager(ScreenManager):
screen_one = ObjectProperty(None)
screen_two = ObjectProperty(None)
screen_three = ObjectProperty(None)
class ScreensApp(App):
def build(self):
return Manager()
def draw_card(self, *args):
some_var = draw_a_card(self, args)
print(some_var)
self.root.screen_two.ids.mylabel.text = some_var
if __name__ == "__main__":
ScreensApp().run()
screens.kv
#:kivy 1.11.0
#:import WipeTransition kivy.uix.screenmanager.WipeTransition
<Manager>:
transition: WipeTransition()
screen_one: screen_one
screen_two: screen_two
screen_three: screen_three
ScreenOne:
id:screen_one
name: "Screen1"
ScreenTwo:
id: screen_two
name: "Screen2"
ScreenThree:
id: screen_three
name: "Screen3"
<ScreenOne>:
Button:
text: "Start"
on_press: root.manager.current = 'Screen2'
size_hint: 0.3, 0.2
pos_hint: {"x":0.35, "y":0.2}
<ScreenTwo>:
Button:
text: "Screen 3"
on_press: root.manager.current = 'Screen3'
size_hint: 0.3, 0.2
pos_hint: {"x":0.35, "y":0.1}
Button:
text: "Karte ziehen" # Draw Card
on_press: app.draw_card()
size_hint: 0.3, 0.2
pos_hint: {"x":0.35, "y":0.3}
Label:
id: mylabel
text: ""
size_hint: 0.3, 0.2
pos_hint: {"x":0.35, "y":0.6}
<ScreenThree>:
Button:
text: "Screen 1"
on_press: root.manager.current = 'Screen1'
输出
我是使用 kivy 编程的新手,我的代码可能需要一些帮助。
我想做的是 运行 函数 draw_card() 并将 Screen2 中的标签文本设置为等于 draw_card 中提到的变量 some_var,当我在 screen2 中的第二个按钮被按下。
我有 3 个文件可以这样做。 main.py 包含我的 python 代码,screens.kv 包含我的 kivy 代码,appvariables.py 包含我的函数和 draw_a_card() 的字典。
有没有办法用普通的变量代替appvariables.py中的card_drawn_dict来输出我抽到的牌?
非常感谢你们。
main.py:
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen, WipeTransition
from kivy.properties import ObjectProperty, StringProperty
from kivy.uix.floatlayout import FloatLayout
from AppVariables import *
class ScreenOne(Screen):
pass
class ScreenTwo(Screen):
pass
class ScreenThree(Screen):
pass
class Manager(ScreenManager):
screen_one = ObjectProperty(None)
screen_two = ObjectProperty(None)
screen_three = ObjectProperty(None)
class ScreensApp(App):
def build(self):
m = Manager(transition=WipeTransition())
return m
def draw_card(self, *args):
draw_a_card(self, *args)
some_var = card_drawn_dict[1]
print(some_var)
screen_one.mylabel.text = some_var
if __name__ == "__main__":
ScreensApp().run()
screens.kv:
#:kivy 1.8.0
<Manager>:
id: screen_manager
screen_one: screen_one
screen_two: screen_two
screen_three: screen_three
ScreenOne:
id:screen_one
name: "Screen1"
manager: screen_manager
ScreenTwo:
id: screen_two
name: "Screen2"
manager: screen_manager
ScreenThree:
id: screen_three
name: "Screen3"
manager: screen_manager
<ScreenOne>:
Button:
text: "Start"
on_press: root.manager.current = 'Screen2'
size_hint: 0.3, 0.2
pos_hint: {"x":0.35, "y":0.2}
<ScreenTwo>:
Button:
text: "Screen 3"
on_press: root.manager.current = 'Screen3'
size_hint: 0.3, 0.2
pos_hint: {"x":0.35, "y":0.1}
Button:
text: "Karte ziehen"
on_press: app.draw_card()
size_hint: 0.3, 0.2
pos_hint: {"x":0.35, "y":0.3}
Label:
id: mylabel
text: ""
size_hint: 0.3, 0.2
pos_hint: {"x":0.35, "y":0.6}
<ScreenThree>:
Button:
text: "Screen 1"
on_press: root.manager.current = 'Screen1'
appvariables.py:
# Module: AppVariables.py
from random import randint
# Global variables
card_dict = {1:'Ace of Hearts', 2:'King of Hearts',
3:'Ace of Diamonds', 4:'King of Diamonds',
5:'Ace of Clubs', 6:'King of Clubs',
7:'Ace of Spades', 8:'King of Spades'}
card_drawn_dict = {}
# Functions
def draw_a_card(self, *args):
random_number = randint(1, 8)
if random_number in card_dict:
card_drawn = card_dict[random_number]
card_drawn_dict.update({1:card_drawn})
#print(card_drawn)
del card_dict[random_number]
else:
while not (random_number in card_dict):
if random_number == 1:
random_number = 8
else:
random_number -= 1
card_drawn = card_dict[random_number]
card_drawn_dict.update({1:card_drawn})
del card_dict[random_number]
填充Screen_Two的标签
使用self.root.screen_two.ids.mylabel.text = some_var
使用变量
一副纸牌有 52 张扑克牌,4 种花色(黑桃、红心、方块、梅花),每种花色有 13 个等级。
例子
AppVariables.py
from random import randint
# Global variables
cardSuits = ['Spades', 'Hearts', 'Diamonds', 'Clubs']
courtCards = ['Jack', 'Queen', 'King']
cardRanks = ['Ace'] + ['{}'.format(x) for x in range(2, 11)] + courtCards
cardsDrawn = []
# Functions
def draw_a_card(self, *args):
# a deck of card has 52 playing cards
if len(cardsDrawn) >= 52:
print("\tcards_drawn=", sorted(cardsDrawn))
return 'Drawn 52 cards!'
# Example set of 52 playing cards; 13 of each suit clubs, diamonds, hearts, and spades
suit = randint(1, 4)
rank = randint(1, 13)
card = '{0}-{1:02d}'.format(suit, rank)
if card not in cardsDrawn:
cardsDrawn.append(card)
return '{0} of {1}'.format(cardRanks[rank-1], cardSuits[suit-1])
else:
# recursive call
return draw_a_card(self, args)
main.py
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty
from AppVariables import *
class ScreenOne(Screen):
pass
class ScreenTwo(Screen):
pass
class ScreenThree(Screen):
pass
class Manager(ScreenManager):
screen_one = ObjectProperty(None)
screen_two = ObjectProperty(None)
screen_three = ObjectProperty(None)
class ScreensApp(App):
def build(self):
return Manager()
def draw_card(self, *args):
some_var = draw_a_card(self, args)
print(some_var)
self.root.screen_two.ids.mylabel.text = some_var
if __name__ == "__main__":
ScreensApp().run()
screens.kv
#:kivy 1.11.0
#:import WipeTransition kivy.uix.screenmanager.WipeTransition
<Manager>:
transition: WipeTransition()
screen_one: screen_one
screen_two: screen_two
screen_three: screen_three
ScreenOne:
id:screen_one
name: "Screen1"
ScreenTwo:
id: screen_two
name: "Screen2"
ScreenThree:
id: screen_three
name: "Screen3"
<ScreenOne>:
Button:
text: "Start"
on_press: root.manager.current = 'Screen2'
size_hint: 0.3, 0.2
pos_hint: {"x":0.35, "y":0.2}
<ScreenTwo>:
Button:
text: "Screen 3"
on_press: root.manager.current = 'Screen3'
size_hint: 0.3, 0.2
pos_hint: {"x":0.35, "y":0.1}
Button:
text: "Karte ziehen" # Draw Card
on_press: app.draw_card()
size_hint: 0.3, 0.2
pos_hint: {"x":0.35, "y":0.3}
Label:
id: mylabel
text: ""
size_hint: 0.3, 0.2
pos_hint: {"x":0.35, "y":0.6}
<ScreenThree>:
Button:
text: "Screen 1"
on_press: root.manager.current = 'Screen1'