Kivy - 标签、按钮和布局

你好世界! 首先,我是这个页面英文版的新手。我认为我的英语很好,但如果有任何错误,请告诉我,我会改正。其次,我编写的代码(稍后我将向您展示)可能不是最有效的,但我只希望它能够工作。事情是这样的...

我正在与 kivy 一起练习,我决定制作一个程序,该程序将从单词列表中创建一个字谜,用户必须猜测单词,程序将判断它是否正确。我做了一个程序来做到这一点,但是我遇到了“新词”按钮的问题(可以说是一个新游戏),所以我决定制作一个新代码(我会在一条评论)。而这个新代码从一开始就失败了。当我添加标签和按钮时,我不仅无法点击它们,而且它们还显示在屏幕的左下方,而且非常小。图像显示结果:Labels,Buttons and RelativeLayout

from kivy.app import App
from kivy.uix.relativelayout import RelativeLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from random import choice,shuffle
from kivy.core.window import Window

Window.clearcolor = (.10,.54,1,1)
Window.size = (500,300)

# ------- THIS PART SHOULD GO ON A SEPARATE FILE ----------------------------
list_of_words = ['ELEPHANT','LION','COCODRILE','MONKEY','KANGAROO']

def create_anagram():
    # Takes a word from the list and shuffles the letters to create the anagram
    choices = choice(list_of_words)
    list_letters = []
    for item in choices:
        list_letters.append(item)
    shuffle(list_letters)
    choices = ''.join(list_letters)

    return choices
# ----------------------------------------------------------------------------
class Anagram(RelativeLayout):

    def __init__(self,**kwargs):
        super(Anagram,self).__init__(**kwargs)
        # These are all variables which will be used later on.

        self.choices = create_anagram()
        self.window = RelativeLayout()
        self.font_size = 20                     
        self.letters,self.underscores = [],[]  
        self.ind = 0                            # Index used on chose_letter()
        self.size_x,self.size_y = 100,50      # Sizes for the labels and button
        self.pos_x = 0                          # Initial position for the labels and buttons
        self.word = ''                          # will concatonate the letters choosen

        self.new_game()

    def new_game(self):
        with self.canvas.after:
            for item in self.choices:
                self.letters.append(Button(text=item,size_hint=(1/len(self.choices),0.2),pos_hint = {'x': self.pos_x,'top': .8},font_size = self.font_size,color='#688FF8',background_color = '#1F48F2',disabled = False))

                self.underscores.append(Label(text='_','top': 0.4},size=(self.size_x,self.size_y),color = '#FFFFFF'))

                self.pos_x += 1/len(self.choices)

            # Adding buttons for the letters and the underscores.
        for item in self.letters:
            self.window.add_widget(item)
        for item in self.underscores:
            self.window.add_widget(item)

class MainAnagramApp(App):
    def build(self):
        return Anagram()

if __name__ == '__main__':
    MainAnagramApp().run()'''

就是这样。这就是代码和问题。知道为什么会发生这种情况吗?

顺便说一下,我试过没有“with self.canvas”,但它甚至没有显示小部件。我也尝试过更改布局(Grid、Anchor 等),但问题完全相同。

谢谢!

tmdgzz 回答:Kivy - 标签、按钮和布局

您不需要 self.window = RelativeLayout()with self.canvas.after:。这是您的 Anagram 类的修改版本:

class Anagram(RelativeLayout):

    def __init__(self,**kwargs):
        super(Anagram,self).__init__(**kwargs)
        # These are all variables which will be used later on.

        self.choices = create_anagram()
        # self.window = RelativeLayout()
        self.font_size = 20
        self.letters,self.underscores = [],[]
        self.ind = 0                            # Index used on chose_letter()
        self.size_x,self.size_y = 100,50      # Sizes for the labels and button
        self.pos_x = 0                          # Initial position for the labels and buttons
        self.word = ''                          # will concatonate the letters choosen

        self.new_game()

    def new_game(self):
        # with self.canvas.after:
        for item in self.choices:
            self.letters.append(Button(text=item,size_hint=(1/len(self.choices),0.2),pos_hint = {'x': self.pos_x,'top': .8},font_size = self.font_size,color='#688FF8',background_color = '#1F48F2',disabled = False))

            self.underscores.append(Label(text='_','top': 0.4},size=(self.size_x,self.size_y),color = '#FFFFFF'))

            self.pos_x += 1/len(self.choices)

        # Adding buttons for the letters and the underscores.
        for item in self.letters:
            self.add_widget(item)
        for item in self.underscores:
            self.add_widget(item)

请注意,ButtonsLabels 是使用 self.add_widget() 而不是 self.window.add_widget() 添加的。

在您的代码中,当您在 Button 内创建 with self.canvas.after: 时,用于绘制 Button 的画布指令会添加到 {{1} } 实例。但是没有添加实际的 canvas.after 小部件。因此,您有一个 Anagram 的图像,但它不会用作 Button

,

这是旧版本的代码。这是对约翰·安德森的回答。

from kivy.app import App
from kivy.uix.relativelayout import RelativeLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from random import choice,shuffle
from kivy.core.window import Window

Window.clearcolor = (24/243,132/243,1,1)
Window.size = (500,300)

list_of_words = ['ELEPHANT','LION','COCODRILE','MONKEY','KANGAROO']

def create_anagram():
    # Chooses a word from the list and shuffles the letters to create the anagram

    choices = choice(list_of_words)
    list_letters = []
    for item in choices:
        list_letters.append(item)
    shuffle(list_letters)
    choices = ''.join(list_letters)

    return choices

class MainApp(App):

    def build(self):

        # These are all variables which will be used later on.
        
        self.choices = create_anagram()
        self.window = RelativeLayout()
        self.font_size = 20
        self.letters,[]
        self.ind = 0                         # Index used on chose_letter()
        self.size_x,50
        self.pos_x = 0
        self.word = ''                       # will concatonate the letters choosen.

        # Adding the buttons to the respectives lists.
        for letter in self.choices:
            self.window.add_widget(Button(text=letter,on_press = self.chose_letter,disabled = False))
            
            self.underscores.append(Label(text='_',color = '#FFFFFF'))

            self.pos_x += 1/len(self.choices)

        # Adding buttons for the letters and the underscores.
        for item in self.letters:
            self.window.add_widget(item)
        for item in self.underscores:
            self.window.add_widget(item)            

        self.RESTART = Button(text='RESTART',size_hint=(0.2,0.1),font_size = 12,pos_hint = {'center_x': .5,'center_y': 0.1},background_color = '#B50E0E',on_press = self.on_press_restart)
        self.window.add_widget(self.RESTART)

        self.SORRY = Label(text='SORRY,WORNG WORD!',size_hint=(.8,.4),pos_hint = {'center_x':0.5,'center_y': 0.45},color = '#1884F3')
        self.window.add_widget(self.SORRY)

        return self.window


    
    def chose_letter(self,instance):
        # When the user clicks on a letter,it adds that letter to the first empty label and to self.word
        
        if self.ind == len(self.choices):               # If we click a button when the word is complete (either correct or incorrect)
            return True                                 # This will allow the program not to add 1 to self.ind (and will not cursh)

        _choice = instance.text                         # Gets the text from the button
        # instance.disabled = True
        self.underscores[self.ind].text = _choice       # Changes the first underscore for the text in _choice
        self.ind += 1                                   # Adds 1 to the index counter
        self.word += _choice                            # Copies the word created,in order to compare it to the words on the list (in the next line)
        

        # It shows a message,either the word is correct or not.
        
        if len(self.choices) == len(self.word):
            if self.word in list_of_words:
                self.CONGRAT = Label(text='CONGRATULATIONS! THE WORD IS: ',font_size = self.font_size)
                self.window.add_widget(self.CONGRAT)

                self.NEW = Button(text='NEW WORD',on_press = self.on_press_new)
                self.window.add_widget(self.NEW)
            else:
                self.SORRY.color = '#000000'

            
        


    def on_press_restart(self,instance):
        
        for item in range(len(self.underscores)):
            self.underscores[item].text = '_'


        self.ind = 0
        self.word = ''
        self.SORRY.color = '#1884F3'
        
    def on_press_new(self,instance):
        # self.choices = create_anagram()
        print(self.choices)
        
        self.window.remove_widget(instance)     # It owrks,but the game doesn't restart.
        self.window.remove_widget(self.CONGRAT)

if __name__ == '__main__':
    MainApp().run()
本文链接:https://www.f2er.com/90019.html

大家都在问