问题描述
当使用 六角砖 和 屏幕 上的模板渲染 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 (将#修改为@)