在Python / Kivy中调整大小时如何避免碰到我的.png

时间:2018-08-21 09:47:49

标签: python resize kivy png

我是Kivy的新手,我试图为以后的计划部分提供一种模板。 现在我被困住了,因为当我尝试调整它们的大小时,我所有的.png圆形圆形按钮都获得了“边缘/凹凸”之王。

这是Button的外观... Img01

...这就是实际发生的情况(请忽略白色背景) Img02

我与其他多个.png一起尝试过,因此我非常确定问题不在.png本身之内。

这是我的代码(为了方便查找相关部分,我对其进行了缩短。如果您觉得需要更多代码,我当然可以添加它):

test.kv

#:kivy 1.0.9

<MainWindow>:
BoxLayout:
    #[shortened for readability reasons]
    BoxLayout:
        #[shortened for readability reasons]
    BoxLayout:
        #[shortened for readability reasons]
        AnchorLayout:
            #[shortened for readability reasons]
        FloatLayout:
            canvas:
                Rectangle:
                    pos: self.pos
                    size: self.size
            Button:
                id: leftButton
                background_normal: 'assets/graphics/buttons/dummy.png'
                background_down: 'assets/graphics/buttons/.png'
                size_hint: .15, .15
                pos_hint: {'x':root.size_hint_x/2, 'y':root.size_hint_y/2}

也许这里的某人有一个问题是什么以及如何解决? 请记住,我想在.kv文件中修复该问题(如果可能),以便以后可以更轻松地重用它。

另一个小问题是其他一些按钮的位置。我想让它们与右侧对齐,但是我找不到如何访问按钮本身的宽度,因此我可以从self.width中减去它(如果我正确的话,它应该是周围布局的宽度) )

有什么建议吗?


在此期间,我做了一些测试,以确保文件类型不是这里的问题。据我所知,其他的最常见的文件类型都支持透明度,因此我尝试使用.gif和.tif。 结果与.png

相同

为弄清设计的外观,我将添加另一张图片:

Img03

所以我认为我必须使用FloatLayout来做到这一点。我想像在pyqt中那样使用网格来做到这一点,但是在奇异的情况下,无法定义应该放置小部件的单元格,也不能给它一个colspan或rowpan。至少我已经读过了。如果我错了,请纠正我。


好的,到目前为止ikolim的解决方案仍然有效,但是又产生了一个问题:我不能再使用background_normal和background_down了,但是我觉得我必须向用户提供视觉反馈-例如-单击按钮并按住。我以为,因为我使用ButtonBehavier,所以我也可以使用background-stuff。但这似乎并非如此。有人可以给我提示如何解决这个问题的人吗?


更新:我得到了视觉反馈,现在可以工作了。解决的方法是如此简单,以至于直到上周五,我才忽略了它(直到现在,我还是会回到有互联网的计算机上)。 因此,对于遇到类似问题的读者来说,这是我的解决方案: 现在,我只使用on_press和on_release侦听器,并将其中的图像源从myPic.png更改为myPic_clicked.png,反之亦然。

因此,问题已解决,我将写出完整的答案,并在几天后关闭此问题。 但是直到那时,我真的很想知道是否有人有一个主意,为什么我会遇到麻烦。一方面是为了全面了解猕猴桃,另一方面是为了避免将来出现该问题。

预先感谢!

2 个答案:

答案 0 :(得分:0)

  • 创建一个继承自ButtonBehavior和Image的自定义按钮
  • 使用GridLayout将自定义按钮连续放置

示例

main.py

def convertDCM(PathDCM) :
   data = []  
   for dirName, subdir, files in os.walk(PathDCM):
          for filename in sorted(files):
                     ds = pydicom.dcmread(PathDCM +'/' + filename)
                     im = fromarray(ds.pixel_array) 
                     im = keras.preprocessing.image.img_to_array(im)
                     im = cv2.resize(im,(300,300))
                     data.append(im) 
   return data

PathDCM = '/home/Desktop/FULL_BALANCED_BW/'

data = convertDCM(PathDCM)

class_names = ['Normal','Abnormal'] #Normal = 0, Abnormal = 1

read = pd.read_excel('/home/FULL_REDUCED_BALANCED_DATA.xlsx')
labels = read.iloc[:,2].tolist()

#scale the raw pixel intensities to the range [0,1]
data = np.array(data, dtype="float")/255.0
labels = np.array(labels,dtype ="uint8")


#splitting data into training and testing

(trainX, testX, trainY, testY) = train_test_split(
                            data,labels, 
                            test_size=0.2, 
                            random_state=42) 

img_width, img_height = 300, 300 #InceptionV3 size

train_samples =  1000
validation_samples = 200
epochs = 10
batch_size = 32

base_model = keras.applications.InceptionV3(
        weights ='imagenet',
        include_top=False, 
        input_shape = (img_width,img_height,3))

#Classifier Model ontop of Convolutional Model
model_top = keras.models.Sequential()
model_top.add(keras.layers.GlobalAveragePooling2D(input_shape=base_model.output_shape[1:], data_format=None)),
model_top.add(keras.layers.Dense(450,activation='relu'))
model_top.add(keras.layers.Dropout(0.5))
model_top.add(keras.layers.Dense(1,activation = 'sigmoid'))
model = keras.models.Model(inputs = base_model.input, outputs = model_top(base_model.output))

#Compiling model using Adam Optimizer 
model.compile(optimizer = keras.optimizers.Adam(
                    lr=0.00002,
                    beta_1=0.9,
                    beta_2=0.999,
                    epsilon=1e-08),
                    loss='binary_crossentropy',
                    metrics=['accuracy'])

#Image Processing and Augmentation 
train_datagen = keras.preprocessing.image.ImageDataGenerator(
          zoom_range = 0.1,
          width_shift_range = 0.2, 
          height_shift_range = 0.2,
          horizontal_flip = True,
          fill_mode ='nearest') 

val_datagen = keras.preprocessing.image.ImageDataGenerator()


train_generator = train_datagen.flow(
        trainX, 
        trainY,
        batch_size=batch_size,
        shuffle=True)

validation_generator = val_datagen.flow(
                testX,
                testY,
                batch_size=batch_size)

#Training the model
history = model.fit_generator(
    train_generator, 
    steps_per_epoch = train_samples//batch_size,
    epochs = epochs, 
    validation_data = validation_generator, 
    validation_steps = validation_samples//batch_size)

输出

Img01

答案 1 :(得分:0)

好吧,似乎没有人知道原始问题是什么,这里至少有一个很好用的解决方案。

ikolims的答案几乎是完全正确的,我想对此表示敬意。但这也错过了-至少对我来说-重要的部分。这是他的代码。之后,我将解释缺少的内容:

from kivy.lang import Builder
from kivy.base import runTouchApp

runTouchApp(Builder.load_string('''
#:kivy 1.11.0

<CustomButton@ButtonBehavior+Image>:
GridLayout:
    rows: 1
    canvas:
        Rectangle:
            pos: self.pos
            size: self.size

    CustomButton:
        id: Button0
        source: './dummy.png'
        size_hint: .15, .15
        pos_hint: {'x':root.size_hint_x/2, 'y':root.size_hint_y/2}
        on_release:
            print('CustomButton clicked')

    CustomButton:
        id: Button1
        source: './dummy.png'
        size_hint: .15, .15
        pos_hint: {'x':root.size_hint_x/2, 'y':root.size_hint_y/2}
        on_release:
            print('CustomButton clicked')

    CustomButton:
        id: Button2
        source: './dummy.png'
        size_hint: .15, .15
        pos_hint: {'x':root.size_hint_x/2, 'y':root.size_hint_y/2}
        on_release:
            print('CustomButton clicked')

    CustomButton:
        id: Button3
        source: './dummy.png'
        size_hint: .15, .15
        pos_hint: {'x':root.size_hint_x/2, 'y':root.size_hint_y/2}
        on_release:
            print('CustomButton clicked')
'''))

问题是,如果我们以此方式进行操作,则那些带有颠簸的错误将消失。但是background_normal和background_down不再起作用了。解决方案是改用on_pressed和on_release并在其中更改源。