六边形上的 Kivy Stencil 以 Screen 作为父级渲染良好,如果父级是窗口,但 ScreenManager 作为父级它有错误?

问题描述

当使用 六角砖屏幕 上的模板渲染 hexdame 板时,没有 ScreenManager 作为父级,它渲染得很好,但使用一个屏幕管理器它似乎有一个显示矩形的模板错误 在模板未使用之后和模板弹出之前。 只有当 Stencil 再次弹出时,它在 ScreenManager 中看起来不错,但是所有其他小部件都不会出现在屏幕上,以免您使用鼠标进行输入。

from kivy.graphics import*
from kivy.uix.floatlayout import*
from kivy.graphics.vertex_instructions import*
from kivy.uix.widget import*
import math 
from math import 

class Hexagon_Tile(FloatLayout):
            class GradientBackground(FloatLayout,Widget):
                class Color(object):
                    
                    
                    def __init__(self,colorx,colory,interval,**kwargs):
                        super().__init__()
                        if colorx[0]==colory[0]:
                            self.redincriment=0
                        elif colorx[0]<colory[0]:
                            self.__red=colory[0]-colorx[0]
                            self.redincriment=self.__red/interval
                        else:
                            self.__red=colorx[0]-colory[0]
                            self.redincriment=-self.__red/interval

                        
                        if colorx[1]==colory[1]:
                            self.greenincriment=0
                        elif colorx[1]<colory[1]:
                            self.__green=colory[1]-colorx[1]
                            self.greenincriment=self.__green/interval
                        else:
                            self.__green=colorx[1]-colory[1]
                            self.greenincriment=-self.__green/interval

                        if colorx[2]==colory[2]:
                            self.blueincriment=0
                        elif colorx[2]<colory[2]:
                            self.__blue=colory[2]-colorx[2]
                            self.blueincriment=self.__blue/interval
                        else:
                            self.__blue=colorx[2]-colory[2]
                            self.blueincriment=-self.__blue/interval
                        self.color=deepcopy(colorx)
                    def regress(self):
                        self.color[0]+=self.redincriment
                        self.color[1]+=self.greenincriment
                        self.color[2]+=self.blueincriment
                    @property
                    def colorvalue(self):
                        return [abs(self.color[0]),abs(self.color[1]),abs(self.color[2])]
                        
                def __init__(self,orientation='horizontal',setsize=(Window.width,Window.height),**kwargs):
                    super().__init__()
                    self.setsize=setsize
                    
                    self.orientation=orientation
                    self.size_hint=(None,None)
                    self.size=self.setsize
                    self.colorx=colorx
                    self.colory=colory
                    self.add_gradient(1)
                    Window.bind(on_resize=self.on_resize)
                    
                def on_resize(self,*args):
                    self.size=self.setsize
                    self.canvas.after.clear()
                    self.add_gradient(.5)

                def add_gradient(self,accuracy):
                    
                    if self.orientation=='horizontal':
                        color=self.Color(self.colorx,self.colory,int(self.setsize[0]))
                        for interval in range(int(self.size[0])):
                            self.canvas.after.add(Color(*color.colorvalue))
                            self.canvas.after.add(Line(points=[interval,self.setsize[1]],width=accuracy))
                            color.regress()
                    elif  self.orientation=='vertical':
                        color=self.Color(self.colorx,int(self.setsize[1]))
                        for interval in range(int(self.size[1])):
                            self.canvas.after.add(Color(*color.colorvalue))
                            self.canvas.after.add(Line(points=[0,self.setsize[0],interval],width=accuracy))
                            color.regress()
            def linetexture(self):

                image=Image(source='C:\\Users\\Benny.HP-PC\\Desktop\\checker\\Gradient\\purple-blue-gradient.jpg',size=(100,100))
                return image.texture
            @property
            def color(self):
                return self.__color__
            @color.setter
            def color(self,color):
                if self.gradient_enabled:
                    if color[0]!=self.gradcolorx or color[1]!=self.gradcolory:
                        self.gradcolorx=color[0]
                        self.gradcolory=color[1]
                        self.clearrender()
                        self.render()
                else:
                    if type(color) is list and len(color)==2:

                        if color[0]!=self.__color__:
                            self.__color__=color[0]
                            self.clearrender()
                            self.render()
                    elif type(color) is list and len(color)==4:
                        if color!=self.__color__:
                            self.__color__=color
                            self.clearrender()
                            self.render()
            @property
            def liningcolor(self):
                return self.outer_color
            @liningcolor.setter
            def liningcolor(self,color):
                if color!=self.outer_color:
                    self.outer_color=color
                    self.clearrender()
                    self.render()
            def __init__(self,hexa,root,gradient=True,**kwargs):
                super().__init__()
                self.gradient_enabled=gradient
                self.gradcolorx=[0,1,1]
                self.gradcolory=[0,1]

                
            
                self.__color__ = [1,1]
                self.hexa = hexa
                self.root = root
                self.number = None
                self.background_color = self.__color__
                self.pos = self.hexa[0]
                self.text = 'hey'
                self.outer_color = [0,1]
                self.outer_set_color = self.outer_color
                self.pressed = False
                self.show_case = self.Hexagon(self.hexa)
                self.render()
                self.down = False
            def spots(self):
                listing=[]
                for x in range(int(Window.width)):
                    for y in range(int(Window.height)):
                        if (int(y) > self.show_case.p1[1] and int(y) < self.show_case.p5[1]) \
                                                            and self.show_case.gradient4 * int(x) + \
                                                            self.show_case.c4 > int(y) \
                                                            and self.show_case.gradient1 * int(
                                                        x) + \
                                                            self.show_case.c1 < int(y) \
                                                            and self.show_case.gradient2 * int(
                                                        x) + \
                                                            self.show_case.c2 < int(y) \
                                                            and self.show_case.gradient3 * int(
                                                        x) + \
                                                            self.show_case.c3 > int(
                                                        y):listing.append([x,y])
                return listing
            def spotify(self,posses,size,num):

                for _ in  range(num):
                    with self.canvas:
                        Color(1,1)
                        self.ellpse=Ellipse(pos=random.choice(posses),size=(size,size))
                        self.ellpse.texture=self.linetexture()
            def render(self):
                if self.gradient_enabled:
                    self.g=self.GradientBackground(self.gradcolorx,self.gradcolory,setsize=(self.hexa[1],self.hexa[1]))
                    self.gradcolor=self.g.export_as_image().texture

                    with self.canvas.before:
                        Color(*self.__color__)
                        self.type = self.show_case.type
                        Color(1,1)
                        StencilPush()
                        self.show = Mesh(vertices=self.show_case.vertices,indices=self.show_case.indices,mode='triangle_fan')
                        StencilUse()
                        self.gradient=Rectangle()
                        self.gradient.pos=(self.pos[0]-self.hexa[1]/2,self.pos[1]*.9)
                        self.gradient.size=(self.hexa[1]*2.3,self.hexa[1]*3.5)
                        self.gradient.texture=self.gradcolor
                        
                        
                        
                        #
                        Color(*self.outer_color)
                        self.lining = Line(points=self.show_case.vertices,width=1,joint='round',cap='round',cap_precision=20,joint_precision=2)
                        self.size = (self.show_case.width,self.show_case.height)
                        self.show.texture=self.linetexture()
                        
                    
                    with self.canvas.after:
                        StencilUnUse()
                        self.shadow=Rectangle()
                        self.shadow.pos=(self.pos[0]-self.hexa[1]/2,self.pos[1]*.9)
                        self.shadow.size=(self.hexa[1]*2.3,self.hexa[1]*3.5)
                        self.shadow.texture=self.gradcolor
                        StencilPop()
                        #self.spotify(self.spots(),15,100)
                        #self.canvas.ask_update()
                    del self.g
                    del self.gradcolor
                    del self.gradient
                else:
                        with self.canvas:    
                            Color(*self.__color__)
                            self.type = self.show_case.type
                        
                            self.show = Mesh(vertices=self.show_case.vertices,mode='triangle_fan')
                            Color(*self.outer_color)                  
                            self.lining = Line(points=self.show_case.vertices,joint_precision=2)            
            def clearrender(self):
                try:
                    self.canvas.remove(self.show)
                except:pass
                try:
                    self.canvas.remove(self.lining)
                except:pass
                try:
                    self.canvas.after.remove(self.show)
                except:pass
                try:
                    self.canvas.after.remove(self.lining)
                except:pass         
            class Hexagon():
                def __init__(self,hexa):
                    self.type = hexa[2]
                    self.HL = hexa[1]
                    self.possd = hexa[0]
                    self.hp1 = self.possd[0]
                    self.hp2 = self.possd[1]

                    if self.type == 1:
                        t1 = self.Triangled([[self.hp1,self.hp2],self.HL,60])
                        t6 = self.Triangled([[self.hp1 - self.HL / 2,t1.points[5]],0])
                        t2 = self.Triangled([[self.hp1,0])
                        t5 = self.Triangled([[self.hp1 + self.HL / 2,t2.points[5]],60])
                        t4 = self.Triangled([[self.hp1 + self.HL / 2,0])
                        t3 = self.Triangled([[self.hp1 + self.HL,60])
                        p1 = [t2.points[0],t2.points[1]]
                        p2 = [t2.points[2],t2.points[3]]
                        p3 = [t3.points[2],t3.points[3]]
                        p4 = [t4.points[4],t4.points[5]]
                        p5 = [t5.points[4],t4.points[5]]
                        p6 = [t6.points[0],t6.points[1]]
                        self.p1 = p1
                        self.p2 = p2
                        self.p3 = p3
                        self.p4 = p4
                        self.p5 = p5
                        self.p6 = p6
                        self.gradient1 = (p1[1] - p6[1]) / (p1[0] - p6[0])

                        self.c1 = p1[1] - self.gradient1 * p1[0]

                        self.gradient2 = (p2[1] - p3[1]) / (p2[0] - p3[0])
                        self.c2 = p2[1] - self.gradient2 * p2[0]
                        self.gradient3 = self.gradient1
                        self.c3 = p3[1] - self.gradient3 * p3[0]
                        self.gradient4 = self.gradient2
                        self.c4 = p5[1] - self.gradient4 * p5[0]
                        self.width = p3[0] - p6[0]
                        self.length = p2[0] - p1[0]
                        self.height = p5[1] - p1[1]
                        self.upcase_point = p4[1]
                        self.lowercase_point = p1[1]
                        self.center=[p6[0]+self.width/2,p1[1]+self.height/2]

                        # if texture=='None':
                        #   pass
                        # else:
                        #    t1.texture=texture
                        #    t2.texture=texture
                        #    t3.texture=texture
                        #    t4.texture=texture
                        #    t5.texture=texture
                        #   t6.texture=texture
                        # return t1,t2,t3,t4,t5,t6
                    if self.type == 0:
                        t1 = self.Triangled([[self.hp1,90])
                        t2 = self.Triangled([[self.hp1,30])
                        t3 = self.Triangled([[t2.points[2],t2.points[3]],90])
                        t4 = self.Triangled([[self.hp1,t3.points[5]],30])
                        t5 = self.Triangled([[t4.points[0],t4.points[1]],90])
                        t6 = self.Triangled([[t1.points[4],30])
                        p1 = [t2.points[0],t3.points[3]]
                        # print(p2,p3)
                        p4 = [t4.points[4],t5.points[5]]
                        p6 = [t1.points[4],t1.points[5]]
                        self.p1 = p1
                        self.p2 = p2
                        self.p3 = p3
                        self.p4 = p4
                        self.p5 = p5
                        self.p6 = p6

                        self.width = p2[0] - p6[0]
                        self.height = p4[1] - p1[1]
                        self.gradient1 = (p1[1] - p2[1]) / (p1[0] - p2[0])

                        self.c1 = p1[1] - self.gradient1 * p1[0]

                        self.gradient2 = (p4[1] - p3[1]) / (p4[0] - p3[0])
                        self.c2 = p3[1] - self.gradient2 * p3[0]
                        self.gradient3 = self.gradient1
                        self.c3 = p4[1] - self.gradient3 * p4[0]
                        self.gradient4 = self.gradient2
                        self.c4 = p6[1] - self.gradient4 * p6[0]
                        self.upcase_point = p2[0]
                        self.lowercae_point = p6[0]
                        self.pos = self.p1
                        # print(f'UP:{self.upcase_point},LOWER:{self.lowercae_point} GRADIENT_1:{self.gradient1} C1:{self.c1}')

                    all_ = [*p1,*p2,*p3,*p4,*p5,*p6,*p1]
                    # print('all:',all_)

                    self.vertices = all_
                    self.indices = [0,2,3,4,5]
                @property
                def area(self):
                    pass
                class Triangled():
                    def __init__(self,triangle):
                        self.poss = triangle[0]
                        self.p1 = self.poss[0]
                        self.p2 = self.poss[1]

                        self.L = triangle[1]
                        self.angle = radians(triangle[2])
                        self.angle_ = radians(60)

                        self.points = [self.p1,self.p2,self.p1 + self.L * cos(self.angle),self.p2 + self.L * sin(self.angle),self.p1 + self.L * cos(self.angle + self.angle_),sin(self.angle + self.angle_) * self.L + self.p2]
        

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)