2017-11-29 24 views
0

がこれについて前に投稿していますが、まだ問題は完全には解決していませんが、私はいくつかの実行可能なコードを持っていますが、私はこのサイトの誰かが修正することができるかもしれませんが、LOLを修正する方法を教えてくれるかもしれません。このIfステートメントの分岐を簡略化/自動化してください。

基本的に私が達成しようとしていることについての説明は、私が何をしているかは役に立たない、または十分な情報を提供していないことを何度も伝えられているので、ここでベストを尽くします。 PDFファイルに請求書を作成して印刷するプログラムがあります。 Pythonスクリプトは、必要なすべての顧客/サービス情報などのCSVファイルから供給されます。

これまでのところ私のコードの問題は、私が持っているサービスの数であり、Python Reportlabsでは、ページ上の文字列をどこに描画するかを選択します。このためのコマンド例は次のようになります。

cursor.drawstring(xLocation,yLocation,String) 

一般的な方法は、文字列6に、上記のものの下に一つずつを通してストリング1を引くであろう。次の3つの例では、最初に、すべてのサービスが請求されている場合の関数の出力方法を示します。いくつかのサービスが顧客に請求されていない場合、第2(中間)は出力です。最終的な(RightMost)の例は、出力したいコードです。

Service 1   Service 1  Service 1 
Service 2       Service 3 
Service 3   Service 3  Service 4 
Service 4   Service 4  Service 6 
Service 5       
Service 6   Service 6 
ブール論理に基づいて

Unfortunalyを、そしてそこに6可能なサービスがあり、それぞれがお好みならば、空または満充電に充電できるか否かということ、そして、この同じことを書くの64の可能な方法があります。完璧な出力を達成する機能。

サービスごとにブール値を作成すると、0が空、1がフルとなると、 となります。000000-111111からすべての可能性をテストする必要があります。コード化するのは完全に合理的です。

しかし、私は6つ以上のサービスが必要であり、必要な機能の数は指数関数的に増加しています。代わりに、各機能を書いて、私はすなわち、0と1セットのファイルを取るプログラムに取り組んでいます:

0000000000 
0000000001 
0000000010 
etc.. 

と各行に各ビットをテストします。この関数は、行のビットに基づいて、ファイル内の各行の関数を書き出します。今、誤った出力が生成されます。私が最初にあなたに私のスクリプトが表示されます:

def testFIle(): 
# This Function will be used to enumerate through the same file you 
used to create the switch dictionary, 
# but will define a function for each line. 

# filepath = '/home/smiley/Desktop/sampletenbools' 
filepath = '/home/smiley/Desktop/10boolsALL' 
with open(filepath) as fp: 
    num = 1 
    for cnt, line in enumerate(fp): 
     var = line 
     b1 = str(var)[0] 
     b2 = str(var)[1] 
     b3 = str(var)[2] 
     b4 = str(var)[3] 
     b5 = str(var)[4] 
     b6 = str(var)[5] 
     b7 = str(var)[6] 
     b8 = str(var)[7] 
     b9 = str(var)[8] 
     b10 = str(var)[9] 

     # YdrawLocationSVC1=490 
     # YdrawLocationSVC2=475 
     # YdrawLocationSVC3=460 
     # YdrawLocationSVC4=445 
     # YdrawLocationSVC5=430 
     # YdrawLocationSVC6=415 
     # YdrawLocationSVC7=400 
     # YdrawLocationSVC8=375 
     # YdrawLocationSVC9=360 
     # YdrawLocationSVC10=345 

     if b1 == "0": 
      YdrawLocationSVC1=1111 
      YdrawLocationSVC2=1 
     if b1 == "1": 
      YdrawLocationSVC1 = 1 

     if b2 == "0": 
      YdrawLocationSVC2=1111 
      YdrawLocationSVC3=2 
     if b2 == "1": 
      YdrawLocationSVC2 = 2 

     if b3 == "0": 
      YdrawLocationSVC3=1111 
      YdrawLocationSVC4=3 
     if b3 == "1": 
      YdrawLocationSVC3 = 3 

     if b4 == "0": 
      YdrawLocationSVC4=1111 
      YdrawLocationSVC5=4 
     if b4 == "1": 
      YdrawLocationSVC4 = 4 

     if b5 == "0": 
      YdrawLocationSVC5=1111 
      YdrawLocationSVC6=5 
     if b5 == "1": 
      YdrawLocationSVC5 = 5 

     if b6 == "0": 
      YdrawLocationSVC6=1111 
      YdrawLocationSVC7=6 
     if b6 == "1": 
      YdrawLocationSVC6 = 6 

     if b7 == "0": 
      YdrawLocationSVC7=1111 
      YdrawLocationSVC8=7 
     if b7 == "1": 
      YdrawLocationSVC7 = 7 

     if b8 == "0": 
      YdrawLocationSVC8=1111 
      YdrawLocationSVC9=8 
     if b8 == "1": 
      YdrawLocationSVC8 = 9 

     if b9 == "0": 
      YdrawLocationSVC9=1111 
      YdrawLocationSVC10=9 
     if b9 == "1": 
      YdrawLocationSVC9 = 9 

     if b10 == "0": 
      YdrawLocationSVC10=1111 
     if b10 == "1": 
      YdrawLocationSVC10 = 10 


     print "# Bitrep ="+str(var).strip("\n") 
     print "def Print"+str(num)+"():" 
     print"\tc.setFont('Deja', 12, leading=None)" 
     print "\t# SERVICE NAME"+\ 
     "\n\tc.drawString(100, "+str(YdrawLocationSVC1)+", stringn1)"+\ 
     "\n\tc.drawString(100, "+str(YdrawLocationSVC2)+", stringn2)"+\ 
     "\n\tc.drawString(100, "+str(YdrawLocationSVC3)+", stringn3)"+\ 
     "\n\tc.drawString(100, "+str(YdrawLocationSVC4)+", stringn4)"+\ 
     "\n\tc.drawString(100, "+str(YdrawLocationSVC5)+", stringn5)"+\ 
     "\n\tc.drawString(100, "+str(YdrawLocationSVC6)+", stringn6)"+\ 
     "\n\tc.drawString(100, "+str(YdrawLocationSVC7)+", stringn7)"+\ 
     "\n\tc.drawString(100, "+str(YdrawLocationSVC8)+", stringn8)"+\ 
     "\n\tc.drawString(100, "+str(YdrawLocationSVC9)+", stringn9)"+\ 
     "\n\tc.drawString(100, "+str(YdrawLocationSVC10)+", stringn10)" 




     # print("{} : {}".format(str(line).strip("\n"), "Print" + str(num))) 
     num += 1 
     # print "\n" 


testFIle() 

Currntlyこのコードは限り唯一のサービスが不足している、ここで、このように適切な出力を生成します。

# Bitrep =1111111101 
def Print1022(): 
c.setFont('Deja', 12, leading=None) 
# SERVICE NAME 
c.drawString(100, 1, stringn1) 
c.drawString(100, 2, stringn2) 
c.drawString(100, 3, stringn3) 
c.drawString(100, 4, stringn4) 
c.drawString(100, 5, stringn5) 
c.drawString(100, 6, stringn6) 
c.drawString(100, 7, stringn7) 
c.drawString(100, 9, stringn8) 
c.drawString(100, 1111, stringn9) 
c.drawString(100, 10, stringn10) 
# Bitrep =1111111110 
def Print1023(): 
c.setFont('Deja', 12, leading=None) 
# SERVICE NAME 
c.drawString(100, 1, stringn1) 
c.drawString(100, 2, stringn2) 
c.drawString(100, 3, stringn3) 
c.drawString(100, 4, stringn4) 
c.drawString(100, 5, stringn5) 
c.drawString(100, 6, stringn6) 
c.drawString(100, 7, stringn7) 
c.drawString(100, 9, stringn8) 
c.drawString(100, 9, stringn9) 
c.drawString(100, 1111, stringn10) 
# Bitrep =1111111111 
def Print1024(): 
c.setFont('Deja', 12, leading=None) 
# SERVICE NAME 
c.drawString(100, 1, stringn1) 
c.drawString(100, 2, stringn2) 
c.drawString(100, 3, stringn3) 
c.drawString(100, 4, stringn4) 
c.drawString(100, 5, stringn5) 
c.drawString(100, 6, stringn6) 
c.drawString(100, 7, stringn7) 
c.drawString(100, 9, stringn8) 
c.drawString(100, 9, stringn9) 
c.drawString(100, 10, stringn10) 

しかし以上で私のコードブレークでロジック1つの不足しているサービスは、ここで次のように:出力が出てファイル内のすべての行については、この次のビットのように見てくるように、誰もがこの問題を解決することができた場合は

# Bitrep =1111100101 
def Print998(): 
c.setFont('Deja', 12, leading=None) 
# SERVICE NAME 
c.drawString(100, 1, stringn1) 
c.drawString(100, 2, stringn2) 
c.drawString(100, 3, stringn3) 
c.drawString(100, 4, stringn4) 
c.drawString(100, 5, stringn5) 
c.drawString(100, 1111, stringn6) 
c.drawString(100, 1111, stringn7) 
c.drawString(100, 9, stringn8) 
c.drawString(100, 1111, stringn9) 
c.drawString(100, 10, stringn10) 
# Bitrep =1111100110 
def Print999(): 
c.setFont('Deja', 12, leading=None) 
# SERVICE NAME 
c.drawString(100, 1, stringn1) 
c.drawString(100, 2, stringn2) 
c.drawString(100, 3, stringn3) 
c.drawString(100, 4, stringn4) 
c.drawString(100, 5, stringn5) 
c.drawString(100, 1111, stringn6) 
c.drawString(100, 1111, stringn7) 
c.drawString(100, 9, stringn8) 
c.drawString(100, 9, stringn9) 
c.drawString(100, 1111, stringn10) 

は、私が見よ、あなたのうちの**** upvoteますl:

def Print999(): 
c.setFont('Deja', 12, leading=None) 
# SERVICE NAME 
c.drawString(100, 1, stringn1) 
c.drawString(100, 2, stringn2) 
c.drawString(100, 3, stringn3) 
c.drawString(100, 4, stringn4) 
c.drawString(100, 5, stringn5) 
c.drawString(100, 1111, stringn6) 
c.drawString(100, 1111, stringn7) 
c.drawString(100, 6, stringn8) 
c.drawString(100, 7, stringn9) 
c.drawString(100, 1111, stringn10) 

def Print764(): 
c.setFont('Deja', 12, leading=None) 
# SERVICE NAME 
c.drawString(100, 1, stringn1) 
c.drawString(100, 2, stringn2) 
c.drawString(100, 1111, stringn3) 
c.drawString(100, 3, stringn4) 
c.drawString(100, 4, stringn5) 
c.drawString(100, 1111, stringn6) 
c.drawString(100, 1111, stringn7) 
c.drawString(100, 5, stringn8) 
c.drawString(100, 6, stringn9) 
c.drawString(100, 1111, stringn10) 

いつものように、あなたが私の記事の最後までそれを作っていたら、私は笑われた以上です。これに少しでも取り組んだ人、そしてこれまで私がこれを手伝ってくれたすべての人々に感謝します。

+0

ちょうど考えがありました。おそらく、各ブール値に辞書のように名前と値を割り当てる方法があります。 0:s1,0:s2,1:s3,0:s4,0:s5,0:s6,1:s7,0:s8,1:s9,0:s10、ここで、0または1はブール状態であり、 ':'はセパレータであり、s1〜s10は対応するビットに関連付けられたサービス名である。 – Jake

+0

上記のようなことがあったら^、空のサービスをすべて削除し、空文字列とそれらを参照する方法を知ることができます。誰かが彼らがその仕事のようなものを作ることができると思いますか? – Jake

答えて

0

はあなたの努力を収縮させることを望まないが、人々はあなたが理由で間違ったことをやっているあなたに言ってきた:)

ReportLabのは、ときにレイアウト変更を意味し、あなたが動的なPDF文書を作成するためのプログラミングツールを使用することができますコンテンツが変更されます。さまざまなコンテンツを期待しているときに、すべての行の位置をハードコードしようとすると、扱いにくい/不可能になってしまいます。

自分で簡単にループを作成してください。最も簡単な例として、基本的なページリストのコードを次に示します。

from reportlab.lib.units import cm 

# get the data selection first 
my_services_list = [1,3,6] # or my_dict, e.g. services {'1': 'message1', etc} 

# set the cursor starting position 
pos_X, pos_Y = 5, 15 

for service in my_services_list: 
    c.drawString(pos_X*cm, pos_Y*cm, service) 
    # move the cursor down a line - remember that zero is the page bottom 
    pos_Y -= 1 

これは、空白行ではありません。 .drawStringは簡単なページでうまく動作します。より包括的なアプローチが必要な場合は、「フレームとフローラブル」のドキュメントをお読みください。デスクトップパブリッシングソフトウェアと同じように、必要に応じてテキストをテキストボックスに流すことができます。

関連する問題