在本例中,在 python/tkinter 的 reportlab/report lab 中,如何调整偏移量、标签之间的间距?

问题描述 投票:0回答:1

我正在使用 reportlab.shapes 创建贴纸标签页。但是,如屏幕截图所示,打印时我需要标签之间没有间距,以便它们适合纸张。我已经尝试过,并且仍在尝试使用来自reportlab的labelOffset,但我没有运气。我正走在正确的道路上吗?如果是的话,我需要调整什么?如果没有,我们非常感谢任何和所有的指导、想法、帮助、意见。

from tkinter import *
from PIL import ImageTk, Image
from tkinter import font
from reportlab.graphics import shapes
from reportlab.graphics.charts.textlabels import LabelOffset
import os
import labels


root = Tk()
root.geometry("900x500")
     
data_frame = LabelFrame(root, background ='#fadc91')
data_frame.pack()
    
lname_label = Label(data_frame, text = "Name, Last:", font = 'Helvetica 11 bold', background ='#fadc91')
lname_label.grid(row=0, column=0, padx=10, pady=10)
def my_lname(*args):
    str1.set(str1.get().upper())
str1=StringVar()
lname = Entry(data_frame, textvariable=str1, width=40)
lname.grid(row=0, column=1, padx=10, pady=10)
str1.trace('w', my_lname)
    
fname_label = Label(data_frame, text = "First:", font = 'Helvetica 11 bold', background ='#fadc91')
fname_label.grid(row=0, column=2, padx=10, pady=10)
def my_fname(*args):
    str2.set(str2.get().upper())
str2=StringVar()
fname = Entry(data_frame, textvariable=str2, width=40)
fname.grid(row=0, column=3, padx=10, pady=10)
str2.trace('w', my_fname)

mname_label = Label(data_frame, text = "Middle Initial:", font = 'Helvetica 11 bold', background ='#fadc91')
mname_label.grid(row=0, column=4, padx=10, pady=10)
def my_mname(*args):
    str3.set(str3.get().upper())
str3=StringVar()
mname = Entry(data_frame, textvariable=str3, width=5)
mname.grid(row=0, column=5, padx=10, pady=10)
str3.trace('w', my_mname)

fnum_label = Label(data_frame, text = "FIN:", font = 'Helvetica 11 bold', background ='#fadc91')
fnum_label.grid(row=1, column=0)
fnum = Entry(data_frame, width=30)
fnum.grid(row=1, column=1)

adate_label = Label(data_frame, text = "Admitted:", font = 'Helvetica 11 bold', background ='#fadc91')
adate_label.grid(row=1, column=2)
adate = Entry(data_frame, width=30)
adate.grid(row=1, column=3)

bday_label = Label(data_frame, text = "DOB:", font = 'Helvetica 11 bold', background ='#fadc91')
bday_label.grid(row=3, column=0)
bday = Entry(data_frame, width=30)
bday.grid(row=3, column=1)


sex = IntVar()
 
gen_label = Label(data_frame, text = "Gender:", font = 'Helvetica 11 bold', background ='#fadc91')
gen_label.grid(row=3, column=2)

mbutton = Radiobutton(data_frame, text="Male", variable=sex, value=1, font = 'Helvetica 11 bold', background ='#fadc91')
mbutton.grid(row=3, column=3, sticky=W)

fbutton = Radiobutton(data_frame, text="Female", variable=sex, value=2, font = 'Helvetica 11 bold', background ='#fadc91')
fbutton.grid(row=4, column=3, sticky=W)

ubutton = Radiobutton(data_frame, text="Unknown", variable=sex, value=3, font = 'Helvetica 11 bold', background ='#fadc91')
ubutton.grid(row=3, column=3)

my_label5 = Label(root, text = "    ", font = 'Helvetica 14 bold', background ='#fadc91')
my_label5.pack()

edit_frame = LabelFrame(root, font = 'Helvetica 12 bold', background ='#fadc91')
edit_frame.pack()

 
global specs
specs = labels.Specification(215.9, 279.4, 4, 15, 44.5, 17.4625, corner_radius=2)

    
def draw_label(label, width, height, lines):
    label.add(shapes.String(2, 38, lines[0], fontName="Helvetica", fontSize=10))
    label.add(shapes.String(2, 28, lines[1], fontName="Helvetica", fontSize=10))
    label.add(shapes.String(2, 18, lines[2], fontName="Helvetica", fontSize=10))
    label.add(shapes.String(2, 8, lines[3], fontName="Helvetica", fontSize=10))


def create_label():
    global sheet
    if sex.get() == 1:
        gender = "M"
    elif sex.get() == 2:
        gender = "F"
    else:
        gender = "U"

    name_line = (lname.get() + ", " + fname.get() + " " + mname.get())
    fin = fnum.get()
    admit_date = ("ADM: " + adate.get())
    dbsxline = ("DOB: " + bday.get() + "          " + gender)
               

    sheet = labels.Sheet(specs, draw_label, border=True)


    sheet.add_label([fin, name_line, dbsxline, admit_date], count = 60)


def make_label():
    sheet.save('downtime_labels.pdf')
    print("{0:d} label(s) output on {1:d} page(s).".format(sheet.label_count, sheet.page_count))
    
    os.startfile("downtime_labels.pdf", "print")
    
    
ml_button = Button(edit_frame, text="Print Labels", font='Helvetica 12 bold', background='light gray', command = lambda: [create_label(), make_label()])
ml_button.grid(row=0, column=1, padx=10, pady=10)

root.mainloop()

sample printout to pdf

python tkinter reportlab
1个回答
0
投票

如果您想删除标签之间的空间,您应该根据页面大小以及行数和列数计算标签的大小。

对于您的情况:

  • 页面宽度= 215.9
  • 页面高度= 279.4
  • 列数 = 4
  • 行数 = 15

因此,标签宽度为

215.9 / 4
,约为
53.97
,标签高度为
279.4 / 15
,约为
18.62

specs = labels.Specification(215.9, 279.4, 4, 15, 53.97, 18.62, corner_radius=2)
© www.soinside.com 2019 - 2024. All rights reserved.