年: 2019年

Python+wxpythonのプログラムで、buttonがアクティブにならない

Linux環境では問題なく動作していたので、Windows10でも動作するだろうと思っていたら、ボタンが表示はされているがアクティブにならない現象が発生!

しばらく悩んだ末、原因判明というか、対応策が判明!

NGだったのは

sizer_4 = wx.BoxSizer(wx.VERTICAL)
self.panel_1 = wx.Panel(self, wx.ID_ANY)
self.panel_3 = wx.Panel(self, wx.ID_ANY)
self.button_1 = wx.Button(self.panel_3, wx.ID_EXIT, "")
self.button_2 = wx.Button(self.panel_3, wx.ID_ANY, "AAAA")
self.button_3 = wx.Button(self.panel_3, wx.ID_ANY, "BBBB")

sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
sizer_2.Add(label_1, 1, wx.EXPAND, 0)
sizer_4.Add(self.button_1, 0, wx.ALIGN_RIGHT | wx.ALL, 10)
sizer_4.Add(self.button_2, 0, wx.ALIGN_RIGHT | wx.ALL, 10)
sizer_4.Add(self.button_3, 0, wx.ALIGN_RIGHT | wx.ALL, 10)
self.panel_3.SetSizer(sizer_4)
sizer_2.Add(self.panel_3, 0, wx.ALIGN_RIGHT | wx.ALL, 10)

要は、sizer4をpanel3に貼り付けて、sizer2へ

これを

sizer_2.Add(label_1, 1, wx.EXPAND, 0)
self.panel_1 = wx.Panel(self, wx.ID_ANY)
self.button_1 = wx.Button(self.panel_1, wx.ID_EXIT, "")
self.button_2 = wx.Button(self.panel_1, wx.ID_ANY, "AAAA")
self.button_3 = wx.Button(self.panel_1, wx.ID_ANY, "BBBB")

sizer_4 = wx.BoxSizer(wx.VERTICAL)
sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
sizer_4.Add(self.button_1, 0, wx.ALIGN_RIGHT | wx.ALL, 10)
sizer_4.Add(self.button_2, 0, wx.ALIGN_RIGHT | wx.ALL, 10)
sizer_4.Add(self.button_3, 0, wx.ALIGN_RIGHT | wx.ALL, 10)
sizer_2.Add(sizer_4, 0, wx.ALIGN_RIGHT | wx.ALL, 10)

sizer4をpanel3をかいさないで、直接sizer2に貼付け

これで、無事windows10でも問題なく動作しました。もちろん、Linuxも

全体的なサイズを決めたい場合など、Panelを介したいと思いますし、ルール的には問題ないと思いますが、極力省けるパネルは入れないようにして、デザインもsizerで設定したほうが、マルチプラットフォームを考えたとき良さそうです。

ホームページやネットショップに載せるバナーや商品画像を作成

バナーや商品画像を作成したり、修正する場合、外注に出すと最低限5,000円(+消費税)程度は、必要になってしまいます。

バナーや商品画像をアドビ イラストレーターなどで作成されていると、ほぼイラストレータでしか編集できないので、ソフトウェア自体の使用費が発生する上に操作も独特で、デザイナーなどには使いやすいと言われているようですが、私個人としては、ん〜難しい!直感的でない!結局テキスト読んで勉強しないと使えない.....その上、毎月費用が発生する。

以前にも紹介したが、漫画作成でプロも使っているCLIP STUDIO PAINT PRO が、操作が直感的でマニュアルはどうしても困った時に見る程度で、機能もイラストを扱う上では十分な機能がある上にProはなんと5,000円で購入できてしまいます。CLIP STUDIO PAINT EX だとアニメーションも作成できるので、動くPOPなどもできてしまいます。

CLIP STUDIO PAINTでバナー作成

バナーのサイズを決めておけば、その上に画像レイヤーやテキストレイヤーを重ねていく感じで、背景が透過の素材を集めておけば、レイヤーの順番を変えたり、表示/非表示を切り替えることで、一度作成したバナーがいろいろなバナーに簡単に変更できます。

商品画像などは、一律の形式で作るようにしていれば、上記と同様な手順で複数の商品画像を1個のCLIPファイルにまとめて管理できます。

と、大変便利に使っているのですが、パソコンのメイン環境がほぼ完全にLinux環境に以降してしまったので、今後のどうするかを検討していました。

CLIP STUDIO PAINTがLinux上で動作すれば良いのですが、残念ながら私のwine環境ではインストールの途中で失敗してしまいました。

やむなく、Oracle Virtual BoxにWindows10をインストールして使用しています。

が、

Linuxのネイティブアプリでは、代替えできるほど使いやすいプログラムは見つけられていませんが、Linuxにインストールできてほぼ実用の範囲で使いやすいプログラムを見つけてしまいました。

Windows10でもCLIP STUDIO PAINTのライバル的扱いとなっている無料で利用できるソフトウェアです。

LinuxにインストールしたMediBang Paint Pro

ジャンプPAINTで最近注目されているようですが、MediBang Paint Pro

は、CLIP STUDIO PAINTと(ブラシの種類など機能不足もあるらしいですが、私の用途では問題ない)同様にプロの使用にも耐えうる高機能で、操作性も直感的で使いやすいです。

なにより、wineで問題なく動作しています。但し、マルチディスプレイ環境だとコマンドウインドウが別画面に表示されることもありますが、許容範囲かと思います。

そうそう、これ無料なんですよね。

無料で使ってもらって素晴らしいイラストや漫画を投稿して下さいというコンセプト

ん、漫画もかけるようになりたいので、暇を作って、投稿できるようになれればなぁ.

..と少々中二病的な爺でした。

 

ぜひ、バナー作りや商品画像作りに挑戦してみて下さい。

もちろん、弊社に作成依頼していただいても、喜んで対応させて頂きます。

お気軽にご依頼ください。

ご要望によっては勉強会的なものも対応させて頂きます。

(試し体験しながら、体で覚え頭で覚えない、頭で考える人なので、講師と一緒に実際に触って頂きながらいろいろなこと体験学習し、困ったときの解決の糸口の見つけ方を学んで、一人で試しながら使えるようになることが目標となります。時間はかかるかもしれませんが、講師の知らないことも自分の必要性に応じて自力で学べるようになって頂ければと思います。….ん〜、さらに仕事が減っちゃう_(汗))

Windows10で使うなら、これ1択

最近、pythonばかりでプログラムを書いているので、配布しやすいようにバイナリ化を検討する中で、「PyOxidizer」なるものを見つけたので試してみます。

PyOxidizerのインストール

PyOxidizerは、Rustでプログラムされているそうで、Rust 2018 (1.31 or newer)がまずはインストールされていないと駄目らしいので、インストールされているか確認する。

$ rustc --version

インストールされていれば、バージョンが表示されます。されない場合は、インストールします。

$ sudo apt install rustc

もう一度

$ rustc --version
rustc 1.36.0

問題ないようなので、PyOxidizer自身のインストールをします。

$ sudo cargo install pyoxidizer

残念ながら私の環境では、

error: failed to compile `pyoxidizer v0.3.0`,….. とエラーとなった

よく見ると、

error: failed to run custom build command for `openssl-sys v0.9.49`

opensslのコンパイルに失敗している….

$ sudo apt-get install libssl-dev

必要ライブラリーをインストールして、再び

$ sudo cargo install pyoxidizer
.......
.......
   Installed package `pyoxidizer v0.3.0` (executable `pyoxidizer`)
warning: be sure to add `/home/xxxxx/.cargo/bin` to your PATH to be able to run the installed binaries

どうやら実行ファイルのパスは手動となるようです。

/home/xxxxx/.profile (xxxxx:自分のパスね)に上記のパスを追記します。

$ vi ~/.profile 
PATH="$PATH:/home/xxxxx/.cargo/bin"
を追記
$ source ~/.profile

これでpathは通るはずなので、確認

$ pyoxidizer --version
PyOxidizer 0.3.0

ん、無事にversionが表示されたので、インストールは完了

いよいよpythonプログラムのバイナリ化の確認だけど、ちょっと時間切れ….またの機会に

 

 

宿泊施設用にIP-PBXを構築した覚書(未FIXの仮版)

システム要件は

  • 内線専用(外線は不要)
  • フロントとお帳場等同時呼び出し
  • 各客室内線
  • 従業員用内線

Ubuntu/Lubuntu 18.04 + Asterisk 16 で構築

最初にとりあえず、システムを最新状態にしておく。

必要なライブラリーを入れる。

sudo apt -y install libedit-dev libnewt-dev libssl-dev libncurses5-dev subversion libsqlite3-dev build-essential libjansson-dev libxml2-dev uuid-dev

Asteriskのソースを入手

# cd /usr/src
# wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-16-current.tar.gz
# tar zxvf asterisk-16-current.tar.gz
# cd asterisk-16.5.1

 

Asteriskのコンパイルとインストール

# sudo ./configure --with-jansson-bundled
# sudo make menuselect
# sudo make
# sudo make install
# sudo make samples
# sudo make basic-pbx
# sudo make config
# sudo make install-logrotate

「sudo make menuselect」の際にコンソールサイズが80×27以上ないと選択画面が表示されません。

Core Sound PackagesでCORE_SOUND-JA-GSM

q->sでsaveして抜けます

Asterisk設定ファイルの修正

 

  • /etc/asterisk/sip.conf
[general]
maxexpirey=3600
defaultexpirey=3600
context=default
;SIPポートは5060
bindport=5060
bindaddr=0.0.0.0
srvlookup=yes
allowguest=no
disallow=all
allow=ulaw
allow=alaw
allow=gsm
language=ja

;電話機用テンプレート(共通設定)
[phone](!)
type=friend
canreinvite=no
host=dynamic
dtmfmode=rfc2833
callgroup=1
pickupgroup=1
disallow=all
allow=ulaw

;ACL
;安全措置のため192.168系以外は受け付けない
;他のネットワークを使用している場合にはここを変更すること
deny=0.0.0.0/0
permit=192.168.0.0/255.255.0.0

;各電話機毎の設定
;以下各番号ごとにパスワード設定
[201](phone)
username=201
secret=pass

[202](phone)
username=202
secret=pass

[203](phone)
username=203
secret=pass

[205](phone)
username=205
secret=pass

[206](phone)
username=206
secret=pass

[207](phone)
username=207
secret=pass

[208](phone)
username=208
secret=pass

[210](phone)
username=210
secret=pass

;以下、省略....実際にはそれどれの番号で設定が必要

 

  • /etc/asterisk/extensions.conf
[general]
writeprotect=no
priorityjumping=no

[globals]
GROUP1=SIP/270&SIP/271&SIP/272&SIP/273&SIP/275
GROUP2=SIP/281&SIP/282&SIP/283&SIP/285&SIP/286&SIP/287&SIP/288
GROUP3=SIP/201&SIP/202&SIP/203&SIP/205&SIP/206&SIP/207&SIP/208&SIP/210&
       SIP/211&SIP/212&SIP/213&SIP/215&SIP/216&SIP/217&SIP/218&SIP/220&
       SIP/221&SIP/222&SIP/223&SIP/225&SIP/226&SIP/227&SIP/228&SIP/230
;自局の着信番号を設定する
;[incoming]セクションを参照

[default]
;200番をフロントに割り当て,270/271/272/273/275をCall
;グループ着信
exten => 200,1,NoOp(フロント着信)
exten => 200,n,Dial(${GROUP1},60)
exten => 200,n,Hangup

;280番を従業員用に割り当て,281/282/283/285/286/288をCall
;グループ着信
exten => 280,1,NoOp(従業員着信)
exten => 280,n,Dial(${GROUP2},60)
exten => 280,n,Hangup

;内線呼び出し
exten => _2ZZ,1,NoOp(内線呼出)
exten => _2ZZ,n,Dial(SIP/${EXTEN},60)
exten => _2ZZ,n,Hangup

この記述はこんな感じというだけで、実際に動作確認したのは別に記述しています。

まぁ、ここは、内線だけなら、この程度という参考

Asteriskをユーザモードで動作させる

この設定をしなくても、問題なく動作します。

しかし、ほぼメンテ無しで長時間動作させる為、セキュリティを配慮してユーザモードで動作させるようにします。

sudo groupadd asterisk
sudo useradd -r -d /var/lib/asterisk -g asterisk asterisk
sudo usermod -aG audio,dialout asterisk
sudo chown -R asterisk.asterisk /etc/asterisk
sudo chown -R asterisk.asterisk /var/{lib,log,spool}/asterisk
sudo chown -R asterisk.asterisk /usr/lib/asterisk

グループ、ユーザを作って、所有者などを変更と

# sudo vi /etc/default/asterisk
AST_USER="asterisk"
AST_GROUP="asterisk"

コメントアウトされているので頭の「#」を消す。

# sudo vi /etc/asterisk/asterisk.conf
runuser = asterisk
rungroup = asterisk

コメントアウトされているので頭の「;」を消す。

 

Asteriskのサービスをスタート

# sudo systemctl restart asterisk
# sudo systemctl enable asterisk

 

Oracle® VM VirtualBox® Oracle VM VirtualBoxを5.2に6.0を上書きインストールしたら、 「rtr3initex failed with rc=-1912 (rc=-1912) virtualbox」が発生して、ゲストOSが起動しなくなりました。 原因は、5.2の残骸(Kernelが残っている)があるとだめなよう
$ dpkg --list virtualbox-*
要望=(U)不明/(I)インストール/(R)削除/(P)完全削除/(H)保持
| 状態=(N)無/(I)インストール済/(C)設定/(U)展開/(F)設定失敗/(H)半インストール/(W)トリガ待ち/(T)トリガ保留
|/ エラー?=(空欄)無/(R)要再インストール (状態,エラーの大文字=異常)
||/ 名前           バージョン   アーキテクチ 説明
+++-==============-============-============-=================================
un  virtualbox-2.0 <なし>       <なし>       (説明 (description) がありません)
un  virtualbox-2.1 <なし>       <なし>       (説明 (description) がありません)
un  virtualbox-2.2 <なし>       <なし>       (説明 (description) がありません)
un  virtualbox-3.0 <なし>       <なし>       (説明 (description) がありません)
un  virtualbox-3.1 <なし>       <なし>       (説明 (description) がありません)
un  virtualbox-3.2 <なし>       <なし>       (説明 (description) がありません)
un  virtualbox-4.0 <なし>       <なし>       (説明 (description) がありません)
un  virtualbox-4.1 <なし>       <なし>       (説明 (description) がありません)
un  virtualbox-4.2 <なし>       <なし>       (説明 (description) がありません)
un  virtualbox-4.3 <なし>       <なし>       (説明 (description) がありません)
un  virtualbox-5.0 <なし>       <なし>       (説明 (description) がありません)
un  virtualbox-5.1 <なし>       <なし>       (説明 (description) がありません)
un  virtualbox-5.2 <なし>       <なし>       (説明 (description) がありません)
ii  virtualbox-6.0 6.0.12-13307 amd64        Oracle VM VirtualBox
ii  virtualbox-dkm 5.2.32-dfsg- all          x86 virtualization solution - ker
un  virtualbox-gue <なし>       <なし>       (説明 (description) がありません)
un  virtualbox-gue <なし>       <なし>       (説明 (description) がありません)
un  virtualbox-mod <なし>       <なし>       (説明 (description) がありません)
un  virtualbox-ose <なし>       <なし>       (説明 (description) がありません)
rc  virtualbox-qt  5.2.32-dfsg- amd64        x86 virtualization solution - Qt 
un  virtualbox-sou <なし>       <なし>       (説明 (description) がありません)
この5.2の残骸を削除します。
$ sudo apt-get autoremove --purge virtualbox-5.2
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
パッケージ 'virtualbox-5.2' はインストールされていないため削除もされません
以下のパッケージは「削除」されます:
  dkms* libgsoap-2.8.60* libvncserver1* virtualbox-dkms*
アップグレード: 0 個、新規インストール: 0 個、削除: 4 個、保留: 4 個。
この操作後に 7,583 kB のディスク容量が解放されます。
続行しますか? [Y/n] y
(データベースを読み込んでいます ... 現在 377057 個のファイルとディレクトリがインストールされています。)
virtualbox-dkms (5.2.32-dfsg-0~ubuntu18.04.1) を削除しています ...

-------- Uninstall Beginning --------
Module:  virtualbox
Version: 5.2.32
Kernel:  4.15.0-62-generic (x86_64)
-------------------------------------
(以下省略)
で、仕上げ
$ sudo /sbin/vboxconfig
vboxdrv.sh: Stopping VirtualBox services.
vboxdrv.sh: Starting VirtualBox services.
vboxdrv.sh: Building VirtualBox kernel modules.
これでバッチリ起動しました。

Linux環境で作成したPythonプログラムが、Windows環境ではout of range

マルチプラットホーム対応で、Webアプリへの転用もできるので、主にPythonでプログラムの作成をしていますが、仕事PCのメインOSをLinuxに移行した関係でプログラム作成、確認も必然的にLinux環境が主となってしまいます。

しかし、お客様の環境は、殆どがWindows7/10ですので、Windows環境で動作することが必要となります。

ところが、残念ながら、pythonで作成したプログラムが、Linux上では問題ないのにWindows上ではエラーを吐いたり、画面表示やライブラリーの動作が異なることが多々あります。

その1つが、「Out of Range」

ファイルの読み書きをする場合に起きやすいエラーですが、CSVファイルの扱いに関しては、以下の盛り込むことで、ファイルの読み書きに関しては対策できます。

書き込み時、
withopen(data_file, 'w', newline='', encoding='utf-8') as fo:
    writer = csv.writer(fo)
    writer.writerows( myFile )
 
読み出し時、
withopen(data_file, 'r', newline='', encoding='utf-8') as fi:
    reader = csv.reader(fi)
    myFile = [row for row in reader]

out of Rangeの要因は、改行の扱いで、「newline=”」を指定することで余分な改行が回避されて正常に読み書きできるようになります。

また、プラットフォームの違いによりエンコードでエラーとなることも多々ありますので、明示的に「encoding=’utf-8’」コード指定しておきます。

その他、ファイルがないのにファイルOpen すると当然エラーなりますので、以下でファイルの有無の判定をします。
if os.path.exists(data_file):
   with open(data_file, 'r', newline='', encoding='utf-8') as fi:
            reader = csv.reader(fi)
            myFile = [row for row in reader]

ファイルがない場合に新規にファイルを作りたい場合は、

if not os.path.exists(data_file):
     with open(data_file, 'w', newline='', encoding='utf-8') as fo:
          writer = csv.writer(fo)
          writer.writerows(myFile)

補足:

data_fileは、パスを含めたファイル名を指定します。

myFileは、読み書きするデータとなります。csv」の場合リストとなります。

wx.ColourDatabaseのサンプル色表示プログラム

Pythonで、少々本格的?な業務アプリケーションを作成するのに色サンプルがほしかったので、簡単なプログラムを作成してみました。

ただ、色見本を表示するだけのプログラムです。

骨組みをwxGladeで作って、Visual Studio Codeで修正して作成しています。

本来は、コピー・ペースト機能も欲しいところですが、まぁ今回は色見本なので…..(-_-;)

やっぱり、できると実用的なので、盛り込みました。

表示の色名を

wxColour("CADET BLUE")

といった感じで使用します。

 

修正版:

マウス右ダブルクリックで該当色を”(r, g, b)”でクリップボードにコピーするように少しコードを追記しました。
“[r,g,b]”の方が使いやすい場合は、(こっちのほうが使いやすいかもしれません。)
 
self.clickcolor = r, g , b
pyperclip.copy(str(self.clickcolor))
 
の所を以下に書き換えます。
 
pyperclip.copy(str([r,g,b]))
 
事前に「pyperclip」をインストールしておく必要があります。
sudo pip3 install pyperclip
(Windows10の場合は、sudoは不要)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# generated by wxGlade 0.9.2 on Thu Mar 21 10:05:00 2019
#
# マウス右ダブルクリックで該当色を”(r, g, b)”でクリップボードにコピー

import wx
import pyperclip

# begin wxGlade: dependencies
# end wxGlade

# begin wxGlade: extracode
# end wxGlade


class MyFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        # begin wxGlade: MyFrame.__init__
        kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        self.SetSize((900, 800))

        self.__set_properties()
        self.__do_layout()
        # end wxGlade

    def __set_properties(self):
        # begin wxGlade: MyFrame.__set_properties
        self.SetTitle("wx.ColourDatabase")
        # end wxGlade

    def __do_layout(self):
        # begin wxGlade: MyFrame.__do_layout
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_6 = wx.BoxSizer(wx.VERTICAL)
        sizer_5 = wx.BoxSizer(wx.VERTICAL)
        sizer_4 = wx.BoxSizer(wx.VERTICAL)
        sizer_3 = wx.BoxSizer(wx.VERTICAL)
        label_69 = wx.StaticText(self, wx.ID_ANY, "  ** マウス右ダブルクリックで該当色(r, g, b)をクリップボードにコピー **")
        sizer_1.Add(label_69, 0, wx.ALL | wx.EXPAND, 1)
        label_70 = wx.StaticText(
            self, wx.ID_ANY, "AQUAMARINE", style=wx.ALIGN_CENTER)
        label_70.SetBackgroundColour(wx.Colour("AQUAMARINE"))
        label_70.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_3.Add(label_70, 0, wx.ALL | wx.EXPAND, 1)
        label_2 = wx.StaticText(
            self, wx.ID_ANY, "BLACK", style=wx.ALIGN_CENTER)
        label_2.SetBackgroundColour(wx.Colour("BLACK"))
        label_2.SetForegroundColour(wx.Colour(255, 255, 255))
        sizer_3.Add(label_2, 0, wx.ALL | wx.EXPAND, 1)
        label_71 = wx.StaticText(
            self, wx.ID_ANY, "BLUE", style=wx.ALIGN_CENTER)
        label_71.SetBackgroundColour(wx.Colour("BLUE"))
        label_71.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_3.Add(label_71, 0, wx.ALL | wx.EXPAND, 1)
        label_72 = wx.StaticText(
            self, wx.ID_ANY, "BLUE VIOLET", style=wx.ALIGN_CENTER)
        label_72.SetBackgroundColour(wx.Colour("BLUE VIOLET"))
        label_72.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_3.Add(label_72, 0, wx.ALL | wx.EXPAND, 1)
        label_73 = wx.StaticText(
            self, wx.ID_ANY, "BROWN", style=wx.ALIGN_CENTER)
        label_73.SetBackgroundColour(wx.Colour("BROWN"))
        label_73.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_3.Add(label_73, 0, wx.ALL | wx.EXPAND, 1)
        label_74 = wx.StaticText(
            self, wx.ID_ANY, "CADET BLUE", style=wx.ALIGN_CENTER)
        label_74.SetBackgroundColour(wx.Colour("CADET BLUE"))
        label_74.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_3.Add(label_74, 0, wx.ALL | wx.EXPAND, 1)
        label_75 = wx.StaticText(
            self, wx.ID_ANY, "CORAL", style=wx.ALIGN_CENTER)
        label_75.SetBackgroundColour(wx.Colour("CORAL"))
        label_75.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_3.Add(label_75, 0, wx.ALL | wx.EXPAND, 1)
        label_76 = wx.StaticText(
            self, wx.ID_ANY, "CORNFLOWER BLUE", style=wx.ALIGN_CENTER)
        label_76.SetBackgroundColour(wx.Colour("CORNFLOWER BLUE"))
        label_76.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_3.Add(label_76, 0, wx.ALL | wx.EXPAND, 1)
        label_77 = wx.StaticText(
            self, wx.ID_ANY, "CYAN", style=wx.ALIGN_CENTER)
        label_77.SetBackgroundColour(wx.Colour("CYAN"))
        label_77.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_3.Add(label_77, 0, wx.ALL | wx.EXPAND, 1)
        label_78 = wx.StaticText(
            self, wx.ID_ANY, "DARK GREY", style=wx.ALIGN_CENTER)
        label_78.SetBackgroundColour(wx.Colour("DARK GREY"))
        label_78.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_3.Add(label_78, 0, wx.ALL | wx.EXPAND, 1)
        label_79 = wx.StaticText(
            self, wx.ID_ANY, "DARK GREEN", style=wx.ALIGN_CENTER)
        label_79.SetBackgroundColour(wx.Colour("DARK GREEN"))
        label_79.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_3.Add(label_79, 0, wx.ALL | wx.EXPAND, 1)
        label_80 = wx.StaticText(
            self, wx.ID_ANY, "DARK OLIVE GREEN", style=wx.ALIGN_CENTER)
        label_80.SetBackgroundColour(wx.Colour("DARK OLIVE GREEN"))
        label_80.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_3.Add(label_80, 0, wx.ALL | wx.EXPAND, 1)
        label_81 = wx.StaticText(
            self, wx.ID_ANY, "DARK ORCHID", style=wx.ALIGN_CENTER)
        label_81.SetBackgroundColour(wx.Colour("DARK ORCHID"))
        label_81.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_3.Add(label_81, 0, wx.ALL | wx.EXPAND, 1)
        label_82 = wx.StaticText(
            self, wx.ID_ANY, "DARK SLATE BLUE", style=wx.ALIGN_CENTER)
        label_82.SetBackgroundColour(wx.Colour("DARK SLATE BLUE"))
        label_82.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_3.Add(label_82, 0, wx.ALL | wx.EXPAND, 1)
        label_83 = wx.StaticText(
            self, wx.ID_ANY, "DARK SLATE GREY", style=wx.ALIGN_CENTER)
        label_83.SetBackgroundColour(wx.Colour("DARK SLATE GREY"))
        label_83.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_3.Add(label_83, 0, wx.ALL | wx.EXPAND, 1)
        label_84 = wx.StaticText(
            self, wx.ID_ANY, "DARK TURQUOISE", style=wx.ALIGN_CENTER)
        label_84.SetBackgroundColour(wx.Colour("DARK TURQUOISE"))
        label_84.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_3.Add(label_84, 0, wx.ALL | wx.EXPAND, 1)
        label_85 = wx.StaticText(
            self, wx.ID_ANY, "DIM GREY", style=wx.ALIGN_CENTER)
        label_85.SetBackgroundColour(wx.Colour("DIM GREY"))
        label_85.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_3.Add(label_85, 0, wx.ALL | wx.EXPAND, 1)
        sizer_2.Add(sizer_3, 1, wx.EXPAND, 0)
        label_86 = wx.StaticText(
            self, wx.ID_ANY, "FIREBRICK", style=wx.ALIGN_CENTER)
        label_86.SetBackgroundColour(wx.Colour("FIREBRICK"))
        label_86.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_4.Add(label_86, 0, wx.ALL | wx.EXPAND, 1)
        label_102 = wx.StaticText(
            self, wx.ID_ANY, "FOREST GREEN", style=wx.ALIGN_CENTER)
        label_102.SetBackgroundColour(wx.Colour("FOREST GREEN"))
        label_102.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_4.Add(label_102, 0, wx.ALL | wx.EXPAND, 1)
        label_87 = wx.StaticText(
            self, wx.ID_ANY, "GOLD", style=wx.ALIGN_CENTER)
        label_87.SetBackgroundColour(wx.Colour("GOLD"))
        label_87.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_4.Add(label_87, 0, wx.ALL | wx.EXPAND, 1)
        label_88 = wx.StaticText(
            self, wx.ID_ANY, "GOLDENROD", style=wx.ALIGN_CENTER)
        label_88.SetBackgroundColour(wx.Colour("GOLDENROD"))
        label_88.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_4.Add(label_88, 0, wx.ALL | wx.EXPAND, 1)
        label_89 = wx.StaticText(
            self, wx.ID_ANY, "GREY", style=wx.ALIGN_CENTER)
        label_89.SetBackgroundColour(wx.Colour("GREY"))
        label_89.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_4.Add(label_89, 0, wx.ALL | wx.EXPAND, 1)
        label_90 = wx.StaticText(
            self, wx.ID_ANY, "GREEN", style=wx.ALIGN_CENTER)
        label_90.SetBackgroundColour(wx.Colour("GREEN"))
        label_90.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_4.Add(label_90, 0, wx.ALL | wx.EXPAND, 1)
        label_91 = wx.StaticText(
            self, wx.ID_ANY, "GREEN YELLOW", style=wx.ALIGN_CENTER)
        label_91.SetBackgroundColour(wx.Colour("GREEN YELLOW"))
        label_91.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_4.Add(label_91, 0, wx.ALL | wx.EXPAND, 1)
        label_92 = wx.StaticText(
            self, wx.ID_ANY, "INDIAN RED", style=wx.ALIGN_CENTER)
        label_92.SetBackgroundColour(wx.Colour("INDIAN RED"))
        label_92.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_4.Add(label_92, 0, wx.ALL | wx.EXPAND, 1)
        label_93 = wx.StaticText(
            self, wx.ID_ANY, "KHAKI", style=wx.ALIGN_CENTER)
        label_93.SetBackgroundColour(wx.Colour("KHAKI"))
        label_93.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_4.Add(label_93, 0, wx.ALL | wx.EXPAND, 1)
        label_94 = wx.StaticText(
            self, wx.ID_ANY, "LIGHT BLUE", style=wx.ALIGN_CENTER)
        label_94.SetBackgroundColour(wx.Colour("LIGHT BLUE"))
        label_94.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_4.Add(label_94, 0, wx.ALL | wx.EXPAND, 1)
        label_95 = wx.StaticText(
            self, wx.ID_ANY, "LIGHT GREY", style=wx.ALIGN_CENTER)
        label_95.SetBackgroundColour(wx.Colour("LIGHT GREY"))
        label_95.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_4.Add(label_95, 0, wx.ALL | wx.EXPAND, 1)
        label_96 = wx.StaticText(
            self, wx.ID_ANY, "LIGHT STEEL BLUE", style=wx.ALIGN_CENTER)
        label_96.SetBackgroundColour(wx.Colour("LIGHT STEEL BLUE"))
        label_96.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_4.Add(label_96, 0, wx.ALL | wx.EXPAND, 1)
        label_97 = wx.StaticText(
            self, wx.ID_ANY, "LIME GREEN", style=wx.ALIGN_CENTER)
        label_97.SetBackgroundColour(wx.Colour("LIME GREEN"))
        label_97.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_4.Add(label_97, 0, wx.ALL | wx.EXPAND, 1)
        label_98 = wx.StaticText(
            self, wx.ID_ANY, "MAGENTA", style=wx.ALIGN_CENTER)
        label_98.SetBackgroundColour(wx.Colour("MAGENTA"))
        label_98.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_4.Add(label_98, 0, wx.ALL | wx.EXPAND, 1)
        label_99 = wx.StaticText(
            self, wx.ID_ANY, "MAROON", style=wx.ALIGN_CENTER)
        label_99.SetBackgroundColour(wx.Colour("MAROON"))
        label_99.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_4.Add(label_99, 0, wx.ALL | wx.EXPAND, 1)
        label_100 = wx.StaticText(
            self, wx.ID_ANY, "MEDIUM AQUAMARINE", style=wx.ALIGN_CENTER)
        label_100.SetBackgroundColour(wx.Colour("MEDIUM AQUAMARINE"))
        label_100.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_4.Add(label_100, 0, wx.ALL | wx.EXPAND, 1)
        label_101 = wx.StaticText(
            self, wx.ID_ANY, "MEDIUM BLUE", style=wx.ALIGN_CENTER)
        label_101.SetBackgroundColour(wx.Colour("MEDIUM BLUE"))
        label_101.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_4.Add(label_101, 0, wx.ALL | wx.EXPAND, 1)
        sizer_2.Add(sizer_4, 1, wx.EXPAND, 0)
        label_103 = wx.StaticText(
            self, wx.ID_ANY, "MEDIUM FOREST GREEN", style=wx.ALIGN_CENTER)
        label_103.SetBackgroundColour(wx.Colour("MEDIUM FOREST GREEN"))
        label_103.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_5.Add(label_103, 0, wx.ALL | wx.EXPAND, 1)
        label_104 = wx.StaticText(
            self, wx.ID_ANY, "MEDIUM GOLDENROD", style=wx.ALIGN_CENTER)
        label_104.SetBackgroundColour(wx.Colour("MEDIUM GOLDENROD"))
        label_104.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_5.Add(label_104, 0, wx.ALL | wx.EXPAND, 1)
        label_105 = wx.StaticText(
            self, wx.ID_ANY, "MEDIUM ORCHID", style=wx.ALIGN_CENTER)
        label_105.SetBackgroundColour(wx.Colour("MEDIUM ORCHID"))
        label_105.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_5.Add(label_105, 0, wx.ALL | wx.EXPAND, 1)
        label_106 = wx.StaticText(
            self, wx.ID_ANY, "MEDIUM SEA GREEN", style=wx.ALIGN_CENTER)
        label_106.SetBackgroundColour(wx.Colour("MEDIUM SEA GREEN"))
        label_106.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_5.Add(label_106, 0, wx.ALL | wx.EXPAND, 1)
        label_107 = wx.StaticText(
            self, wx.ID_ANY, "MEDIUM SLATE BLUE", style=wx.ALIGN_CENTER)
        label_107.SetBackgroundColour(wx.Colour("MEDIUM SLATE BLUE"))
        label_107.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_5.Add(label_107, 0, wx.ALL | wx.EXPAND, 1)
        label_108 = wx.StaticText(
            self, wx.ID_ANY, "MEDIUM SPRING GREEN", style=wx.ALIGN_CENTER)
        label_108.SetBackgroundColour(wx.Colour("MEDIUM SPRING GREEN"))
        label_108.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_5.Add(label_108, 0, wx.ALL | wx.EXPAND, 1)
        label_109 = wx.StaticText(
            self, wx.ID_ANY, "MEDIUM TURQUOISE", style=wx.ALIGN_CENTER)
        label_109.SetBackgroundColour(wx.Colour("MEDIUM TURQUOISE"))
        label_109.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_5.Add(label_109, 0, wx.ALL | wx.EXPAND, 1)
        label_110 = wx.StaticText(
            self, wx.ID_ANY, "MEDIUM VIOLET RED", style=wx.ALIGN_CENTER)
        label_110.SetBackgroundColour(wx.Colour("MEDIUM VIOLET RED"))
        label_110.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_5.Add(label_110, 0, wx.ALL | wx.EXPAND, 1)
        label_111 = wx.StaticText(
            self, wx.ID_ANY, "MIDNIGHT BLUE", style=wx.ALIGN_CENTER)
        label_111.SetBackgroundColour(wx.Colour("MIDNIGHT BLUE"))
        label_111.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_5.Add(label_111, 0, wx.ALL | wx.EXPAND, 1)
        label_112 = wx.StaticText(
            self, wx.ID_ANY, "NAVY", style=wx.ALIGN_CENTER)
        label_112.SetBackgroundColour(wx.Colour("NAVY"))
        label_112.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_5.Add(label_112, 0, wx.ALL | wx.EXPAND, 1)
        label_113 = wx.StaticText(
            self, wx.ID_ANY, "ORANGE", style=wx.ALIGN_CENTER)
        label_113.SetBackgroundColour(wx.Colour("ORANGE"))
        label_113.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_5.Add(label_113, 0, wx.ALL | wx.EXPAND, 1)
        label_114 = wx.StaticText(
            self, wx.ID_ANY, "ORANGE RED", style=wx.ALIGN_CENTER)
        label_114.SetBackgroundColour(wx.Colour("ORANGE RED"))
        label_114.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_5.Add(label_114, 0, wx.ALL | wx.EXPAND, 1)
        label_115 = wx.StaticText(
            self, wx.ID_ANY, "ORCHID", style=wx.ALIGN_CENTER)
        label_115.SetBackgroundColour(wx.Colour("ORCHID"))
        label_115.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_5.Add(label_115, 0, wx.ALL | wx.EXPAND, 1)
        label_116 = wx.StaticText(
            self, wx.ID_ANY, "PALE GREEN", style=wx.ALIGN_CENTER)
        label_116.SetBackgroundColour(wx.Colour("PALE GREEN"))
        label_116.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_5.Add(label_116, 0, wx.ALL | wx.EXPAND, 1)
        label_117 = wx.StaticText(
            self, wx.ID_ANY, "PINK", style=wx.ALIGN_CENTER)
        label_117.SetBackgroundColour(wx.Colour("PINK"))
        label_117.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_5.Add(label_117, 0, wx.ALL | wx.EXPAND, 1)
        label_118 = wx.StaticText(
            self, wx.ID_ANY, "PLUM", style=wx.ALIGN_CENTER)
        label_118.SetBackgroundColour(wx.Colour("PLUM"))
        label_118.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_5.Add(label_118, 0, wx.ALL | wx.EXPAND, 1)
        label_119 = wx.StaticText(
            self, wx.ID_ANY, "PURPLE", style=wx.ALIGN_CENTER)
        label_119.SetBackgroundColour(wx.Colour("PURPLE"))
        label_119.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_5.Add(label_119, 0, wx.ALL | wx.EXPAND, 1)
        sizer_2.Add(sizer_5, 1, wx.EXPAND, 0)
        label_120 = wx.StaticText(
            self, wx.ID_ANY, "RED", style=wx.ALIGN_CENTER)
        label_120.SetBackgroundColour(wx.Colour("RED"))
        label_120.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_6.Add(label_120, 0, wx.ALL | wx.EXPAND, 1)
        label_121 = wx.StaticText(
            self, wx.ID_ANY, "SALMON", style=wx.ALIGN_CENTER)
        label_121.SetBackgroundColour(wx.Colour("SALMON"))
        label_121.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_6.Add(label_121, 0, wx.ALL | wx.EXPAND, 1)
        label_122 = wx.StaticText(
            self, wx.ID_ANY, "SEA GREEN", style=wx.ALIGN_CENTER)
        label_122.SetBackgroundColour(wx.Colour("SEA GREEN"))
        label_122.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_6.Add(label_122, 0, wx.ALL | wx.EXPAND, 1)
        label_123 = wx.StaticText(
            self, wx.ID_ANY, "SIENNA", style=wx.ALIGN_CENTER)
        label_123.SetBackgroundColour(wx.Colour("SIENNA"))
        label_123.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_6.Add(label_123, 0, wx.ALL | wx.EXPAND, 1)
        label_124 = wx.StaticText(
            self, wx.ID_ANY, "SKY BLUE", style=wx.ALIGN_CENTER)
        label_124.SetBackgroundColour(wx.Colour("SKY BLUE"))
        label_124.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_6.Add(label_124, 0, wx.ALL | wx.EXPAND, 1)
        label_125 = wx.StaticText(
            self, wx.ID_ANY, "SLATE BLUE", style=wx.ALIGN_CENTER)
        label_125.SetBackgroundColour(wx.Colour("SLATE BLUE"))
        label_125.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_6.Add(label_125, 0, wx.ALL | wx.EXPAND, 1)
        label_126 = wx.StaticText(
            self, wx.ID_ANY, "SPRING GREEN", style=wx.ALIGN_CENTER)
        label_126.SetBackgroundColour(wx.Colour("SPRING GREEN"))
        label_126.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_6.Add(label_126, 0, wx.ALL | wx.EXPAND, 1)
        label_127 = wx.StaticText(
            self, wx.ID_ANY, "STEEL BLUE", style=wx.ALIGN_CENTER)
        label_127.SetBackgroundColour(wx.Colour("STEEL BLUE"))
        label_127.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_6.Add(label_127, 0, wx.ALL | wx.EXPAND, 1)
        label_128 = wx.StaticText(
            self, wx.ID_ANY, "TAN", style=wx.ALIGN_CENTER)
        label_128.SetBackgroundColour(wx.Colour("TAN"))
        label_128.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_6.Add(label_128, 0, wx.ALL | wx.EXPAND, 1)
        label_129 = wx.StaticText(
            self, wx.ID_ANY, "THISTLE", style=wx.ALIGN_CENTER)
        label_129.SetBackgroundColour(wx.Colour("THISTLE"))
        label_129.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_6.Add(label_129, 0, wx.ALL | wx.EXPAND, 1)
        label_130 = wx.StaticText(
            self, wx.ID_ANY, "TURQUOISE", style=wx.ALIGN_CENTER)
        label_130.SetBackgroundColour(wx.Colour("TURQUOISE"))
        label_130.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_6.Add(label_130, 0, wx.ALL | wx.EXPAND, 1)
        label_131 = wx.StaticText(
            self, wx.ID_ANY, "VIOLET", style=wx.ALIGN_CENTER)
        label_131.SetBackgroundColour(wx.Colour("VIOLET"))
        label_131.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_6.Add(label_131, 0, wx.ALL | wx.EXPAND, 1)
        label_132 = wx.StaticText(
            self, wx.ID_ANY, "VIOLET RED", style=wx.ALIGN_CENTER)
        label_132.SetBackgroundColour(wx.Colour("VIOLET RED"))
        label_132.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_6.Add(label_132, 0, wx.ALL | wx.EXPAND, 1)
        label_133 = wx.StaticText(
            self, wx.ID_ANY, "WHEAT", style=wx.ALIGN_CENTER)
        label_133.SetBackgroundColour(wx.Colour("WHEAT"))
        label_133.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_6.Add(label_133, 0, wx.ALL | wx.EXPAND, 1)
        label_134 = wx.StaticText(
            self, wx.ID_ANY, "WHITE", style=wx.ALIGN_CENTER)
        label_134.SetBackgroundColour(wx.Colour("WHITE"))
        label_134.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_6.Add(label_134, 0, wx.ALL | wx.EXPAND, 1)
        label_135 = wx.StaticText(
            self, wx.ID_ANY, "YELLOW", style=wx.ALIGN_CENTER)
        label_135.SetBackgroundColour(wx.Colour("YELLOW"))
        label_135.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_6.Add(label_135, 0, wx.ALL | wx.EXPAND, 1)
        label_136 = wx.StaticText(
            self, wx.ID_ANY, "YELLOW GREEN", style=wx.ALIGN_CENTER)
        label_136.SetBackgroundColour(wx.Colour("YELLOW GREEN"))
        label_136.SetForegroundColour(wx.Colour(0, 0, 0))
        sizer_6.Add(label_136, 0, wx.ALL | wx.EXPAND, 1)
        sizer_2.Add(sizer_6, 1, wx.EXPAND, 0)
        sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)
        self.SetSizer(sizer_1)
        sizer_1.Fit(self)
        self.Layout()
        # end wxGlade

        label_2.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_70.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_71.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_72.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_73.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_74.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_75.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_76.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_77.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_78.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_79.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_80.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_81.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_82.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_83.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_84.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_85.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_86.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_87.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_88.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_89.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_90.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_91.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_92.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_93.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_94.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_95.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_96.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_97.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_98.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_99.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_100.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_101.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_102.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_103.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_104.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_105.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_106.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_107.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_108.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_109.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_110.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_111.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_112.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_113.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_114.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_115.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_116.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_117.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_118.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_119.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_120.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_121.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_122.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_123.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_124.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_125.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_126.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_127.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_128.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_129.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_130.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_131.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_132.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_133.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_134.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_135.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)
        label_136.Bind(wx.EVT_RIGHT_DCLICK, self.Clicpcolorcode)

    def Clicpcolorcode(self, event): 
        get_object = event.GetEventObject() 
        [r,g,b,a]=get_object.GetBackgroundColour()
        self.clickcolor = r, g , b
        pyperclip.copy(str(self.clickcolor))

# end of class MyFrame


class MyApp(wx.App):
    def OnInit(self):
        self.frame = MyFrame(None, wx.ID_ANY, "")
        self.SetTopWindow(self.frame)
        self.frame.Show()
        return True

# end of class MyApp


if __name__ == "__main__":
    app = MyApp(0)
    app.MainLoop()

このソースを「ColourDatabase.py」とでもして保存して

python3 ColourDatabase.py

ちなみに事前にwxpythonをインストールしておく必要があります。(pyperclipも)

おまけ

event処理なので、色の取得がしたい場合は、

get_object = event.GetEventObject()
[r,g,b,a]=get_object.GetBackgroundColour()
 
で、r,g,bを適当に編集して、以下のようにすると色が変えられます。
 
get_object.SetBackgroundColour([r,g,b])
 
もちろん、直接式を挿入してもOK
 
get_object.SetBackgroundColour([r-10,g-10,b-10])
xxxxxなんか処理して、色を戻す
get_object.SetBackgroundColour([r+10,g+10,b+10])
 
こんな形で元の色を気にしないで、一時的に色を変えることもできます。

 

Windows7を意識したLinuxを検討

Windows7/Windows Windows7を使用してきたユーザーが、Linuxの乗り換えるのに必要な条件とは?

Microsoft Windowsで使用して使い慣れたアプリケーションがそのまま使用できるのが理想ですが、現実的には難しく、これはWindows10に移行した場合でも一部のソフトウェアでは発生する問題で、見栄え&操作は変わることは多々発生しますので、

  1. Windows7/Windows Vista環境で使用していたデータファイルを取り扱えること
  2. Windows7/Windows Vistaから違和感の少ない見た目と操作性があること
  3. 極力GUIでユーザーフレンドリーであること
  4. 長期間安定した運用が期待できること
  5. Windows7/Windows Vista世代のPCで実用性のある性能が期待できること
  6. 低コストであること

1.に関しては、マイナーなアプリ専用フォーマット以外の標準的なデータ形式にはLinuxで対応可能なので、概ねどのLinuxディストリビュートでも問題ないと思われます。

2.に関しては、従来はWindows7と酷似のUIもありましたが、最近では、感覚的に類似の見た目と操作性を提供して、なお且つ動作が軽いXfceを採用したLinuxを選択するのが良いかと思います。(Xfce以外にも類似のものはありますが、現時点ではメジャーで標準設定での類似性と軽量である点からXfce)

3.に関しては、Xfce+各種サポートツールがGUI化されていて、初期セットアップ時を除きCUIの使用が不要なものとなると思います。

4.に関しては、シェアーや積極的な活動をみるにUbuntu系を選択することになろうかと思います。

5.に関しては、Xfce採用のLinuxであれば、ほぼ問題ないと思われます。

6.に関しては、有料のLinuxももちろんありますが、基本的にはLinuxであれば無償で使用できます。

以上から…….

 

Ubuntu系の

Xubuntu

Ubuntuの公式派生ディストリビュートなので、長期運用の安心感があります。

また、参考とできる情報も多く、Ubuntuの中では軽快な部類となります。

Zorin OS

以前からWindowsを意識したGUI(現在ではXfce)を提供しており、わかりやすい優しい見た目がでWindowsユーザーにはとつきやすいと思います。

GUIのみで操作可能で、日本語化もGUIで可能です。

デフォルトでWineがインストールされていますが、使用したいと思うようなWindowsアプリが使用できる可能性は残念ながら低いように思います。

Ubuntu系ではなく、ArchLinux系となりますが、より多く、より新しいアプリを使いたい方は、ArchLinuxに初期設定からGUI化した

Manjaro Linux という選択もありかと思います。(VirtualVoxでの確認結果が良好でしたので、私のセカンダリーPCのOSとして評価継続中)

ArchLinuxは、一般にはかなりハードルが高いですが、 Manjaro Linux XFCE Edition だと軽量なうえGUI化されており、セットアップ時の日本語化で少しCUIを使用するだけで、運用自体はGUIで可能となります。標準設定ではArch User Repositories(AUR)の安定版を更に確認後提供しているので、新しいアプリをより安心して使用できます。また、多少の設定変更でAURも利用可能となりますので、Linuxで無償で提供されているアプリの多くを動作させることができます。(ライブラリのリビジョンの違いとかでコンパイルに失敗してセットアップできないこともあるようです。)

ガンガン自分用にカスタマイズしたい方は、KDE Plasmaデスクトップなので多少マシンパワーが必要(Core2、2GBなら十分実用的)になりますが、Manjaro Linux KDE Edition も良いかもしれません。デフォルトのパッケージマネージャがOctopiなので詳しい方でないと扱いにくいのでpamacをインストールしてこちらをパッケージマネージャに使用するとカテゴリ別表示ができて、随分とユーザーフレンドリーになり、比較的簡単に目的のアプリケーションを見つけてインストール/アンインストールできます。

その他、Ubuntu系でKDEのデモとして提供されている「 KDE neon 」も評判がよくUbuntu本家についで使用されているようですが、残念ながら私のテスト環境では、Live CDは起動するもののインストール後起動せずで、評価できていません。KDE Plasmaデスクトップなので、軽量ではないはずですが、以外に軽快に動作するらしいです。

 

LinuxホストVirtualBoxにWindows10(x64)をインストール

UbuntuのソフトウェアからインストールできるVirtualBoxは5.xでx86しかサポートしていないので、6.0をダウンロードしてインストールします。

Download VirtualBox for Linux Hosts

から、使用しているLinuxにあったものをダウンロード、インストールします。

インストールしたあと、Kernelの再構成が必要です。

sudo /sbin/vboxconfig

これを行っていないと仮想環境が起動できない場合があります。

あと、システムBIOSでVT-x(Intel CPU)/AMD-V(AMD CPU)を有効にしておきましょう。メーカ製PCの場合、有効になってない場合が多いかと思います。

Windows10インストール環境作成

システム メインメモリ:2GB(ホストのシステムメモリより小さい値にします。)

システム プロセッサー:ホストが4コア以上であれば、コア数は2以上

あとは、初期値で良いと思いますが、ディスプレイの2Dアクセラレータくらいは有効にします。

Windows10をインストール

Windows10のインストール媒体もしくはイメージをVirtualBoxの仮想マシンのCDにマウントして、仮想マシンを起動すると通常のWindows10のインストールが始まるので、標準通りインストールをします。

インストールが完了したら、仮想マシンのウインドウメニュのデバイス配下の「Insert Gues Additions CDイメージの挿入」を選ぶとインストールプログラムが起動するので指示通りインストールをすすめて最後に再起動したら完了です。

これで、マウスはバリアフリーでホストOSとゲストOS間を意識しないで行き来できますし、フルスクリーン表示も問題なくできるようになります。

さらにVirtualBoxの仮想マシンの環境設定で一般->高度にあるクリップボードとドラック&ドロップを双方向に、あと共通フォルダーの設定をしておくと起動後はホストOSからほとんどゲストOS(今回はWindows10)を意識しないでデータのやり取りもできるようになります。

トラブル対応

Windows10のインストーラが途中で止まってしまう場合は、VirtualBoxのシステム・アクセラレーションの準仮想化インターフェースをLegacyにすると良いようです。

クロネコヤマト(ヤマト運輸)の「送り状発行システムB2クラウド」を使用する

クラウドなので、Linux上で使用するのもWindows10で使用するのも同じです。

事前にプリンターを事前に手動で設定しておく必要があります。この設定方法が異なるだけで、送り状発行システムB2クラウドの操作に違いはありません。

プリンタードライバーをインストールする。

本格的な業務用プリンターを導入されている場合は、経費面でリース導入されている場合が多いと思います。この場合は、リース会社にご相談いただくのが良いと思います。ここでは手持ちのプリンターを使用する場合を記載します。

OSはUbuntu(Xubuntu)18.05

プリンターは、EPSONの格安業務用プリンターPX-105 Amazonなどを見ていると色々悪い評価もあるようですが、基本的には価格以上に働いてくれます。不安であれば、複数台用意しておいても良いくらいのお値段で入手できます。

エプソン プリンター A4 インクジェット PX-105

新品価格
¥6,444から
(2019/2/9 16:38時点)

A5マルチ用紙(インクジェット専用)への印字も特に問題ありません。

もちろん、最初の1回だけ位置合わせだけは若干調整が必要ですが、これはどのプリンターを使用しても期待した正確な位置への印字するには必要な作業となります。(B2クラウド->各種設定の変更->プリンタ・送り状レイアウト)

このプリンターはドライバーのインストールが事前に必要になります。

セイコーエプソン株式会社のLinuxドライバーダウンロードへ

ここでPX-105のドライバーを検索、xxxx.deb(通常は64ビット版)をインストールします。

次に設置マネージャーのプリンタを開きます。直接接続であれば、ここでプリンターを接続するだけで表示されると思いますが、表示されていない場合やネットワークプリンターの場合、追加をクリック、ネットワークプリンターだとネットワークプリンターのところを選ぶと接続されているプリンターが表示されているので、接続したいプリンターを選択して指示に従います。

「プリンタードライバのインストールしています。ドライバーのインストールが必要です」と言われますが、待っていいると事前にインストールしたドライバーを認識して表示が変わりますので、あとは指示通りで完了です。

気がついた問題

Firefox65ですと2019年2月時点では印刷ダイアログが開かないようです。Chromium(確認バージョン: 71.0.3578.98)を使用するのが良さそうです。

おそらく、Google Chromeでも問題ないと思われます。(未確認)