Gibt es für tkinter Vektorgrafik Bibliotheken?
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
Canvas hat doch Splines, aber keine Becierkurve. Oder warum heißt es sonst 'splinesteps'', was man da einstellen kann? Default ist auf 12. Wirksam, wenn smooth auf 1 oder true gesetzt ist.
Aber es gibt auch SVG Grafiken, die man ohne Nachbearbeitung so lassen kann, wie etwa diese:
Aber es gibt auch SVG Grafiken, die man ohne Nachbearbeitung so lassen kann, wie etwa diese:
Code: Alles auswählen
import tkinter as tk
root = tk.Tk()
canvas = tk.Canvas(root,width=300,height=350)
canvas.pack()
scale = 0.03
item = canvas.create_polygon(6830,7688,6830,7688,6704,7505,6541,7508,6465,7445,6384,7392,6299,7351,6163,7285,6043,7189,5938,7075,5804,6320,5573,5818,5363,5496,5578,5321,5418,5081,5658,5241,5914,4889,5818,4473,6042,4665,6234,4121,6090,3610,6362,3737,6362,3034,6083,2712,6339,2712,6083,1848,5476,1816,5711,1515,4964,1145,4516,1465,4699,1067,3771,1131,3716,1784,3390,1111,2772,1125,2843,1359,2452,1168,2054,1338,2154,1537,1791,1494,1393,1978,1621,2042,1244,2290,1123,2866,1386,2930,1109,3072,1166,3854,1400,3733,1258,4060,1400,4501,1656,4423,1514,4686,1834,5226,1983,5069,1940,5318,2201,5568,1925,5978,1733,6664,1849,7809,1978,9068,2102,9777,2167,10124,2052,10242,1983,10389,1983,10549,1983,10932,2375,10922,2857,10922,3340,10922,3732,10932,3732,10549,3732,10465,3713,10384,3678,10310,3915,10341,4227,10354,4545,10289,4526,10346,4515,10407,4515,10469,4515,10852,4907,10842,5389,10842,5647,10842,5878,10845,6038,10789,6051,10791,6058,10792,6058,10792,9918,11261,6830,7688,6830,7688,fill='#ffcb09',smooth=1)
canvas.scale(item,0,0,scale,scale)
item = canvas.create_polygon(6262,10512,6263,10498,6264,10484,6264,10469,6264,10445,6262,10422,6259,10399,6386,10472,6584,10483,6815,10485,6637,10510,6447,10520,6262,10512,fill='#ffcb09',smooth=1)
canvas.scale(item,0,0,scale,scale)
item = canvas.create_polygon(7326,9475,7319,9335,7304,9198,7284,9065,7371,9233,7447,9400,7503,9555,7449,9523,7389,9496,7326,9475,fill='#ffcb09',smooth=1)
canvas.scale(item,0,0,scale,scale)
item = canvas.create_polygon(5099,5335,5227,5607,5579,5319,5419,5080,5659,5240,5915,4888,5819,4472,6043,4664,6235,4120,6091,3609,6363,3736,6363,3033,6084,2711,6340,2711,6084,1847,5477,1815,5712,1514,4965,1144,4517,1464,4700,1066,3772,1130,3717,1783,3391,1110,2773,1124,2844,1358,2453,1167,2055,1337,2155,1536,1792,1493,1394,1977,1622,2041,1245,2289,1124,2865,1387,2929,1110,3071,1167,3853,1401,3732,1259,4059,1401,4500,1657,4422,1515,4685,1835,5225,1984,5068,1941,5317,2297,5658,2375,5459,2531,5815,2865,5971,2986,5829,2922,6021,3242,6184,3370,5921,3342,6255,3498,6326,3590,5928,3647,6326,3917,6362,3917,5857,4038,6262,4330,6170,4379,5779,4436,6078,4604,5943,4634,5655,4730,5911,5115,5687,5099,5335,fill='#a26327')
canvas.scale(item,0,0,scale,scale)
item = canvas.create_polygon(4980,4344,4903,4845,4259,5162,3542,5051,2826,4940,2308,4444,2385,3943,2409,3791,2485,3655,2599,3544,2603,3505,2607,3467,2613,3428,2735,2640,3362,2082,4013,2183,4665,2284,5094,3004,4972,3793,4963,3856,4950,3917,4934,3977,4982,4095,4999,4219,4980,4344,fill='#ffcb09',smooth=1)
canvas.scale(item,0,0,scale,scale)
item = canvas.create_polygon(3276,10299,3451,10595,3375,10841,3413,10793,3488,10533,3333,10303,3276,10299,fill='#a26327',smooth=1)
canvas.scale(item,0,0,scale,scale)
item = canvas.create_polygon(2313,10781,2350,10830,2217,10489,2458,10289,2401,10292,2171,10505,2313,10781,fill='#a26327',smooth=1)
canvas.scale(item,0,0,scale,scale)
item = canvas.create_polygon(2835,10306,2835,10306,2920,10547,2827,10821,2827,10821,2889,10879,2907,10597,2926,10304,2814,10215,2835,10306,fill='#a26327',smooth=1)
canvas.scale(item,0,0,scale,scale)
item = canvas.create_polygon(3586,3041,3658,3019,3691,2918,3660,2814,3628,2710,3545,2643,3473,2665,3401,2687,3368,2788,3399,2892,3430,2996,3514,3062,3586,3041,fill='#a26327',smooth=1)
canvas.scale(item,0,0,scale,scale)
item = canvas.create_polygon(4120,3065,4191,3062,4246,2974,4241,2868,4237,2763,4175,2679,4104,2682,4032,2685,3978,2774,3982,2879,3987,2985,4048,3068,4120,3065,fill='#a26327',smooth=1)
canvas.scale(item,0,0,scale,scale)
item = canvas.create_polygon(6831,7687,6831,7687,6705,7504,6542,7507,6922,7821,7182,8390,7285,9064,7537,9552,7703,10031,7522,10224,7522,10201,7522,10177,7520,10148,7506,9854,7368,9785,7413,9871,7413,9871,7491,10051,7489,10254,7409,10318,7287,10373,7141,10415,7139,10384,6979,10176,7083,9850,7015,9883,6941,10170,7129,10417,7130,10417,7131,10418,7132,10418,6826,10506,6415,10540,6057,10493,6049,10299,5941,10162,5895,10160,5975,10280,6006,10397,6019,10487,5821,10457,5641,10401,5508,10315,5513,10264,5519,10232,5519,10232,5533,10172,5495,10190,5472,10289,5263,10133,5192,9888,5393,9528,5990,9151,5889,9029,5650,9178,5824,8845,5741,8780,5602,8722,5421,9034,5573,8680,5234,8665,5244,9080,5194,8884,5061,8904,5108,9430,4905,9799,4913,10069,5023,10267,4964,10343,4899,10515,4941,10718,4975,10762,4939,10537,5042,10298,5141,10453,5303,10561,5469,10635,5491,10787,5527,10747,5527,10747,5519,10716,5514,10684,5510,10652,5786,10766,6060,10791,6060,10791,9919,11260,6831,7687,6831,7687,fill='#a26327',smooth=1)
canvas.scale(item,0,0,scale,scale)
item = canvas.create_polygon(5162,2143,5481,2440,5190,2732,4923,2705,4923,2705,4907,2679,4878,2638,5036,2623,5176,2450,4988,2275,4800,2100,4654,2278,4604,2353,4583,2338,4561,2324,4539,2312,4539,2312,4800,1807,5162,2143,fill='#a26327',smooth=1)
canvas.scale(item,0,0,scale,scale)
item = canvas.create_polygon(2914,1830,3354,1608,3466,2165,3466,2165,3431,2173,3397,2184,3364,2197,3340,2117,3251,1888,3014,2007,2775,2128,2880,2345,3038,2393,3006,2419,2987,2437,2987,2437,2723,2387,2525,2026,2914,1830,fill='#a26327',smooth=1)
canvas.scale(item,0,0,scale,scale)
item = canvas.create_polygon(4275,4480,4270,4530,4224,4593,4126,4617,4023,4642,3881,4647,3795,4453,3795,4453,3753,4177,3771,4050,3825,4034,4016,3951,4081,3809,4152,3651,4095,3644,3729,3601,3363,3558,3665,3981,3665,3981,3665,3981,3717,4033,3746,4048,3742,4094,3737,4226,3769,4453,3769,4453,3753,4647,3568,4660,3348,4674,3289,4535,3284,4503,3278,4471,3266,4499,3266,4499,3266,4499,3262,4702,3565,4693,3731,4688,3785,4517,3785,4517,3785,4517,3872,4673,4047,4662,4315,4646,4299,4454,4299,4454,4299,4454,4281,4430,4275,4480,fill='#a26327',smooth=1)
canvas.scale(item,0,0,scale,scale)
root.mainloop()
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
Kommt doch ganz gut oder?
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
Eines machen wir noch:
Code: Alles auswählen
import tkinter as tk
root = tk.Tk()
canvas = tk.Canvas(root,width=350,height=280)
canvas.pack()
scale = 0.03
item = canvas.create_polygon(11303,6152,11137,6053,11226,6084,11249,6031,11041,5922,11039,5918,11037,5914,11036,5909,10958,5653,10798,4214,10424,3417,10295,3142,10169,3112,10106,3118,10105,3118,9753,2655,9178,2326,8392,2233,8510,1356,8285,808,7207,705,6278,616,5623,1375,5427,1634,5135,1392,4773,1249,4380,1249,4045,1249,3731,1354,3464,1536,3176,1211,2594,704,1825,778,462,908,462,1749,795,3068,795,3068,940,3372,752,3822,575,4244,500,4872,1517,5006,1536,5481,1585,6447,2800,6562,3556,6633,4027,6327,4320,5906,4263,6450,4254,7097,4405,7667,4405,7667,4748,8078,5663,7667,5411,5609,5533,5731,5672,5845,5826,5947,5824,6521,5851,7301,5988,7872,5988,7872,6601,8170,7301,7858,7301,7858,7295,7206,7151,6464,7396,6509,7654,6533,7919,6533,8087,6533,8247,6523,8399,6505,8406,6819,8438,7138,8512,7437,8512,7437,8829,7848,9677,7437,9529,6135,9590,6098,9648,6059,9703,6018,9718,6574,9759,7171,9856,7624,9856,7624,10459,7957,11149,7608,11149,7608,11095,7035,10986,6291,10987,6293,10987,6295,10987,6297,11006,6295,11004,6173,11094,6318,11139,6304,11194,6269,11114,6127,11218,6269,11303,6152,fill='#b19aca',smooth=1)
canvas.scale(item,0,0,scale,scale)
item = canvas.create_polygon(2902,5953,2120,5863,2056,5326,2090,5003,2406,4944,2647,4786,2827,4602,2930,4772,3083,4912,3311,5012,3288,5205,3192,5453,2882,5612,2882,5612,2596,5679,2774,5771,2912,5842,3343,5784,3603,5491,3495,5787,3287,5997,2902,5953,fill='#b19aca',smooth=1)
canvas.scale(item,0,0,scale,scale)
item = canvas.create_polygon(11302,6153,11137,6053,11226,6084,11249,6032,11041,5922,11039,5919,11037,5915,11036,5910,10958,5653,10798,4215,10424,3418,10295,3143,10169,3113,10106,3119,10168,3200,10222,3285,10270,3374,10271,3373,10275,3382,10280,3392,10285,3401,10324,3478,10359,3558,10389,3640,10662,4339,10861,5434,10987,6297,11006,6296,11004,6174,11094,6318,11139,6305,11194,6270,11114,6128,11218,6270,11302,6153,fill='#662f90',smooth=1)
canvas.scale(item,0,0,scale,scale)
item = canvas.create_polygon(10346,7677,10346,7677,10307,7385,10459,7381,10610,7377,10606,7672,10606,7672,10606,7672,10482,7738,10346,7677,fill='#662f90',smooth=1)
canvas.scale(item,0,0,scale,scale)
item = canvas.create_polygon(10745,7616,10745,7616,10689,7376,10801,7354,10801,7354,10952,7340,10950,7584,10950,7584,10889,7663,10745,7616,fill='#662f90',smooth=1)
canvas.scale(item,0,0,scale,scale)
item = canvas.create_polygon(10222,7635,10222,7635,10247,7367,10133,7362,10133,7362,9986,7363,10013,7593,10013,7593,10068,7662,10222,7635,fill='#662f90',smooth=1)
canvas.scale(item,0,0,scale,scale)
item = canvas.create_polygon(7993,3004,8267,1870,8267,1147,7144,1035,6342,955,5787,1674,5656,1862,5956,2215,6141,2692,6141,3218,6141,3522,6152,3811,6126,4068,6314,4376,6655,4721,7228,4686,8243,4623,8184,4038,8028,3651,7873,3265,7993,3004,7993,3004,fill='#662f90',smooth=1)
canvas.scale(item,0,0,scale,scale)
item = canvas.create_polygon(2773,5772,2912,5843,3342,5785,3602,5492,3643,5380,3669,5255,3685,5127,3542,5099,3418,5060,3310,5013,3287,5206,3191,5454,2881,5613,2881,5613,2595,5680,2773,5772,fill='#662f90',smooth=1)
canvas.scale(item,0,0,scale,scale)
item = canvas.create_polygon(5262,5873,4977,5628,4959,5341,4992,5146,4888,5161,4775,5172,4653,5178,4623,5281,4587,5385,4545,5488,4697,5902,5164,6094,5329,6054,5524,6006,5262,5873,5262,5873,fill='#662f90',smooth=1)
canvas.scale(item,0,0,scale,scale)
item = canvas.create_polygon(3970,2638,3878,2624,3787,2723,3765,2858,3744,2994,3802,3116,3893,3130,3985,3145,4077,3046,4098,2910,4120,2775,4062,2653,3970,2638,fill='#662f90',smooth=1)
canvas.scale(item,0,0,scale,scale)
item = canvas.create_polygon(4771,2702,4680,2670,4567,2751,4520,2884,4473,3017,4510,3151,4602,3183,4695,3216,4807,3134,4854,3001,4901,2868,4864,2734,4771,2702,fill='#662f90',smooth=1)
canvas.scale(item,0,0,scale,scale)
item = canvas.create_polygon(6519,7938,6519,7938,6480,7646,6632,7642,6783,7638,6779,7933,6779,7933,6779,7933,6655,7999,6519,7938,fill='#662f90',smooth=1)
canvas.scale(item,0,0,scale,scale)
item = canvas.create_polygon(6918,7877,6918,7877,6861,7637,6974,7615,6974,7615,7125,7601,7123,7845,7123,7845,7062,7924,6918,7877,fill='#662f90',smooth=1)
canvas.scale(item,0,0,scale,scale)
item = canvas.create_polygon(6395,7896,6395,7896,6420,7628,6306,7623,6306,7623,6159,7624,6186,7854,6186,7854,6241,7923,6395,7896,fill='#662f90',smooth=1)
canvas.scale(item,0,0,scale,scale)
item = canvas.create_polygon(3800,4206,3800,4206,4165,3935,4678,4170,4678,4170,4219,3772,3800,4206,fill='#662f90',smooth=1)
canvas.scale(item,0,0,scale,scale)
arg1 = [1428,4357,1617,4245,1755,4394,1755,4394,2317,4299,2214,4567,2146,4685,2378,4635,2561,4519,2702,4383,2700,4378,2699,4373,2697,4368,2694,4358,2690,4349,2687,4339,2684,4327,2680,4316,2677,4304,2674,4294,2671,4284,2668,4273,2665,4262,2662,4250,2659,4238,2656,4227,2654,4217,2652,4206,2649,4194,2646,4182,2644,4170,2642,4159,2640,4148,2638,4137,2635,4125,2633,4113,2631,4101,2629,4089,2627,4078,2626,4066,2624,4054,2622,4042,2621,4030,2619,4018,2617,4006,2616,3994,2615,3982,2613,3970,2612,3957,2611,3945,2609,3933,2608,3920,2607,3908,2606,3896,2605,3883,2604,3871,2603,3858,2602,3845,2601,3833,2600,3820,2599,3808,2599,3795,2598,3782,2597,3769,2597,3756,2596,3743,2595,3731,2595,3717,2594,3704,2594,3691,2593,3678,2593,3665,2592,3652,2592,3639,2592,3626,2591,3612,2591,3599,2591,3585,2590,3572,2590,3558,2590,3545,2590,3532,2590,3518,2589,3504,2589,3491,2589,3477,2589,3464,2589,3450,2589,3436,2589,3421,2589,3406,2589,3393,2588,3381,2588,3369,2588,3349,2588,3330,2588,3311,2588,3302,2588,3294,2588,3285,2588,3257,2588,3230,2588,3202,2588,3166,2589,3131,2591,3095,2592,3084,2593,3073,2593,3061,2595,3038,2596]
arg2 = [3014,2599,2990,2600,2977,2602,2964,2603,2951,2606,2929,2608,2907,2611,2886,2613,2873,2615,2860,2618,2847,2621,2825,2625,2804,2629,2783,2631,2770,2634,2758,2637,2745,2641,2724,2646,2702,2651,2681,2654,2669,2657,2658,2660,2646,2666,2624,2672,2602,2679,2580,2682,2570,2685,2560,2688,2549,2696,2526,2704,2502,2712,2479,2715,2471,2717,2463,2720,2455,2730,2428,2741,2401,2752,2374,2754,2370,2755,2367,2756,2364,2823,2206,2908,2060,3008,1929,3009,1928,3009,1927,3010,1926,3029,1901,3049,1877,3070,1853,3071,1852,3072,1850,3073,1849,3093,1825,3114,1802,3136,1779,3136,1778,3137,1777,3138,1776,3160,1753,3183,1730,3206,1708,2947,1438,2485,1080,1888,1137,742,1247,742,1954,1022,3064,1022,3064,1144,3320,986,3698,853,4014,790,4466,1376,4642,1306,4538,1302,4431,1428,4357]
item = canvas.create_polygon(*(arg1+arg2),fill='#662f90',smooth=1)
canvas.scale(item,0,0,scale,scale)
root.mainloop()
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
Und hier noch etwas Einfaches:
Code: Alles auswählen
import tkinter as tk
root = tk.Tk()
canvas = tk.Canvas(root,width=350,height=280)
canvas.pack()
scale = 0.03
item = canvas.create_polygon(7408,4804,6718,3138,6325,3043,6245,3043,5607,709,4471,933,4471,933,3701,956,3238,1863,2960,2981,2904,2975,2507,3005,1789,4741,1077,6460,1535,7342,1618,7479,1618,7479,1634,7509,1647,7508,1660,7507,1681,7468,1681,7468,1724,7415,2237,6768,2581,5790,2535,6610,2545,7201,2545,7202,2545,7202,2578,7587,3877,7696,3629,7850,3282,7938,3282,7938,3443,8231,3725,7962,3392,8315,3593,8509,3890,8143,3742,8380,4005,8486,4154,8321,4348,7985,4456,7723,4512,7724,4569,7724,4628,7724,4759,7724,4882,7722,4997,7718,5073,7968,5194,8269,5334,8425,5628,8332,5569,8097,5788,8458,6067,8269,5734,7916,6016,8185,6177,7892,6177,7892,5861,7811,5616,7670,6667,7536,6667,7196,6667,7196,6668,6740,6659,6318,6641,5926,6984,6863,7473,7479,7515,7531,7515,7531,7536,7570,7549,7571,7562,7571,7578,7542,7578,7542,7662,7405,8119,6523,7408,4804,fill='#010101',smooth=1)
canvas.scale(item,0,0,scale,scale)
item = canvas.create_polygon(5039,1445,4724,1426,4626,1703,4601,1737,4576,1770,4547,1720,4547,1720,4547,1720,4194,1319,3786,1615,3174,2060,2388,6997,3192,7300,3926,7577,4681,7535,4681,7535,6225,7535,6292,7199,6292,7199,6435,1477,5039,1445,5039,1445,fill='#ffffff',smooth=1)
canvas.scale(item,0,0,scale,scale)
item = canvas.create_polygon(4872,2234,4949,2230,5014,2319,5019,2432,5024,2544,4966,2638,4890,2642,4813,2645,4747,2556,4743,2443,4738,2331,4796,2237,4872,2234,fill='#010101',smooth=1)
canvas.scale(item,0,0,scale,scale)
item = canvas.create_polygon(4071,2482,4037,2372,4073,2263,4149,2240,4226,2217,4315,2288,4349,2399,4382,2509,4347,2618,4270,2641,4193,2664,4104,2593,4071,2482,fill='#010101',smooth=1)
canvas.scale(item,0,0,scale,scale)
item = canvas.create_polygon(4965,3769,4965,3769,4443,3563,4235,2961,4235,2961,4658,2787,5044,2921,5044,2921,5186,3294,4965,3769,fill='#010101',smooth=1)
canvas.scale(item,0,0,scale,scale)
root.mainloop()
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
Ach so, die Quellenangabe: http://www.vectorsland.com/vector/free- ... 69715.html
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
@Sirius3 Hab mir angeschaut, woran es liegt. Die ersten beiden Koordinaten der Becierkurve sind keine Kurvenpunkte, sondern Kontrollpunkte zur Berechnung der Kurve.
Also, erste Näherung wäre, man läßt sie weg.
Besser: man verwendet sie zur Berechnung von mehr Zwischenpunkten.
Also, erste Näherung wäre, man läßt sie weg.
Besser: man verwendet sie zur Berechnung von mehr Zwischenpunkten.
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
Also Weglassen der Kontrollpunkte ist schon mal keine Lösung:
Hi Alfons
Hier noch eine Vereinfachung deines letzten Skript durch den Einsatz eines Tags Pingu:
Gruss wuf
Hier noch eine Vereinfachung deines letzten Skript durch den Einsatz eines Tags Pingu:
Code: Alles auswählen
import tkinter as tk
root = tk.Tk()
canvas = tk.Canvas(root,width=350,height=280)
canvas.pack()
scale = 0.03
canvas.create_polygon(7408,4804,6718,3138,6325,3043,6245,3043,5607,709,4471,933,4471,933,3701,956,3238,1863,2960,2981,2904,2975,2507,3005,1789,4741,1077,6460,1535,7342,1618,7479,1618,7479,1634,7509,1647,7508,1660,7507,1681,7468,1681,7468,1724,7415,2237,6768,2581,5790,2535,6610,2545,7201,2545,7202,2545,7202,2578,7587,3877,7696,3629,7850,3282,7938,3282,7938,3443,8231,3725,7962,3392,8315,3593,8509,3890,8143,3742,8380,4005,8486,4154,8321,4348,7985,4456,7723,4512,7724,4569,7724,4628,7724,4759,7724,4882,7722,4997,7718,5073,7968,5194,8269,5334,8425,5628,8332,5569,8097,5788,8458,6067,8269,5734,7916,6016,8185,6177,7892,6177,7892,5861,7811,5616,7670,6667,7536,6667,7196,6667,7196,6668,6740,6659,6318,6641,5926,6984,6863,7473,7479,7515,7531,7515,7531,7536,7570,7549,7571,7562,7571,7578,7542,7578,7542,7662,7405,8119,6523,7408,4804,fill='#010101', tags='Pingu')
canvas.create_polygon(5039,1445,4724,1426,4626,1703,4601,1737,4576,1770,4547,1720,4547,1720,4547,1720,4194,1319,3786,1615,3174,2060,2388,6997,3192,7300,3926,7577,4681,7535,4681,7535,6225,7535,6292,7199,6292,7199,6435,1477,5039,1445,5039,1445,fill='#ffffff', tags='Pingu')
canvas.create_polygon(4872,2234,4949,2230,5014,2319,5019,2432,5024,2544,4966,2638,4890,2642,4813,2645,4747,2556,4743,2443,4738,2331,4796,2237,4872,2234,fill='#010101', tags='Pingu')
canvas.create_polygon(4071,2482,4037,2372,4073,2263,4149,2240,4226,2217,4315,2288,4349,2399,4382,2509,4347,2618,4270,2641,4193,2664,4104,2593,4071,2482,fill='#010101', tags='Pingu')
canvas.create_polygon(4965,3769,4965,3769,4443,3563,4235,2961,4235,2961,4658,2787,5044,2921,5044,2921,5186,3294,4965,3769,fill='#010101', tags='Pingu')
canvas.scale('Pingu', 0, 0, scale,scale)
canvas.itemconfig('Pingu', smooth=1, splinesteps=12)
root.mainloop()
Take it easy Mates!
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
@wuf
Hi wuf, der Pingu war nicht gut. Habe jetzt das Becier Format herausbekommen und mache dann aus 3 Koordinaten 10. Das Vögelchen sieht dann so aus:
Hi wuf, der Pingu war nicht gut. Habe jetzt das Becier Format herausbekommen und mache dann aus 3 Koordinaten 10. Das Vögelchen sieht dann so aus:
Code: Alles auswählen
import tkinter as tk
root = tk.Tk()
canvas = tk.Canvas(root,width=400,height=350)
canvas.pack()
scale = 0.03
coordinates = [None]
def move_to(x,y):
coordinates[0] = [x,y]
def becier(*args):
for index in range(0,len(args),6):
px0 = coordinates[0][-2]
py0 = coordinates[0][-1]
px1 = args[index]
py1 = args[index+1]
px2 = args[index+2]
py2 = args[index+3]
px3 = args[index+4]
py3 = args[index+5]
# B(t) = (1-t)^3 * P0 + 3t * (1-t)^2 * P1 + 3 t^2 * (1-t) * P2 + t^3 * P3 t€(0,1)
for T in range(1,9):
t = T/10
Bx = (1-t)*(1-t)*(1-t)*px0 + 3*t*(1-t)*(1-t)*px1+3*t*t*(1-t)*px2+t*t*t*px3
By = (1-t)*(1-t)*(1-t)*py0 + 3*t*(1-t)*(1-t)*py1+3*t*t*(1-t)*py2+t*t*t*py3
coordinates[0].append(Bx)
coordinates[0].append(By)
coordinates[0].append(args[index+4])
coordinates[0].append(args[index+5])
def line_to(*args):
for entry in args: coordinates[0].append(entry)
move_to(8988,4286)
line_to(9770,3752,8655,3425)
becier(7723,1788,5822,2642,5186,4199,4420,6075,2224,6760,2224,6760,3787,8619,5196,8954,6136,8880,7077,8806,9615,8066,9087,4766,9059,4595,9026,4435,8988,4286)
item = canvas.create_polygon(*coordinates[0],fill='#2ba9e1',smooth=1)
canvas.scale(item,0,0,scale,scale)
move_to(8655,3426)
becier(8788,3660,8901,3945,8988,4286)
line_to(9770,3753,8655,3426)
item = canvas.create_polygon(*coordinates[0],fill='#2b3277')
canvas.scale(item,0,0,scale,scale)
move_to(7412,5497)
becier(7412,5497,4803,4959,4503,6411,4204,7863,6613,8705,7412,5497)
item = canvas.create_polygon(*coordinates[0],fill='#2b3277',smooth=1)
canvas.scale(item,0,0,scale,scale)
move_to(7915,3385)
becier(7932,3541,7852,3678,7735,3691,7618,3705,7509,3589,7491,3433,7473,3278,7554,3140,7671,3127,7788,3114,7897,3229,7915,3385)
item = canvas.create_polygon(*coordinates[0],fill='#2b3277',smooth=1)
canvas.scale(item,0,0,scale,scale)
root.mainloop()
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
Und jetzt schaut auch der pingu gut aus:
Code: Alles auswählen
import tkinter as tk
coordinates = [None]
def move_to(x,y):
coordinates[0] = [x,y]
def becier(*args):
for index in range(0,len(args),6):
px0 = coordinates[0][-2]
py0 = coordinates[0][-1]
px1 = args[index]
py1 = args[index+1]
px2 = args[index+2]
py2 = args[index+3]
px3 = args[index+4]
py3 = args[index+5]
# B(t) = (1-t)^3 * P0 + 3t * (1-t)^2 * P1 + 3 t^2 * (1-t) * P2 + t^3 * P3 t€(0,1)
for T in range(1,9):
t = T/10
Bx = (1-t)*(1-t)*(1-t)*px0 + 3*t*(1-t)*(1-t)*px1+3*t*t*(1-t)*px2+t*t*t*px3
By = (1-t)*(1-t)*(1-t)*py0 + 3*t*(1-t)*(1-t)*py1+3*t*t*(1-t)*py2+t*t*t*py3
coordinates[0].append(Bx)
coordinates[0].append(By)
coordinates[0].append(args[index+4])
coordinates[0].append(args[index+5])
def line_to(*args):
for entry in args: coordinates[0].append(entry)
root = tk.Tk()
canvas = tk.Canvas(root,width=350,height=280)
canvas.pack()
scale = 0.03
move_to(7408,4804)
becier(6718,3138,6325,3043,6245,3043,5607,709,4471,933,4471,933,3701,956,3238,1863,2960,2981,2904,2975,2507,3005,1789,4741,1077,6460,1535,7342,1618,7479,1618,7479,1634,7509,1647,7508,1660,7507,1681,7468,1681,7468,1724,7415,2237,6768,2581,5790,2535,6610,2545,7201,2545,7202,2545,7202,2578,7587,3877,7696,3629,7850,3282,7938,3282,7938)
line_to(3443,8231,3725,7962,3392,8315,3593,8509,3890,8143,3742,8380,4005,8486)
becier(4154,8321,4348,7985,4456,7723,4512,7724,4569,7724,4628,7724,4759,7724,4882,7722,4997,7718,5073,7968,5194,8269,5334,8425)
line_to(5628,8332,5569,8097,5788,8458,6067,8269,5734,7916,6016,8185,6177,7892)
becier(6177,7892,5861,7811,5616,7670,6667,7536,6667,7196,6667,7196,6668,6740,6659,6318,6641,5926,6984,6863,7473,7479,7515,7531,7515,7531,7536,7570,7549,7571,7562,7571,7578,7542,7578,7542,7662,7405,8119,6523,7408,4804)
canvas.create_polygon(*coordinates[0],fill='#010101',smooth=1,tag='pingu')
move_to(5039,1445)
becier(4724,1426,4626,1703,4601,1737,4576,1770,4547,1720,4547,1720,4547,1720,4194,1319,3786,1615,3174,2060,2388,6997,3192,7300,3926,7577,4681,7535,4681,7535,6225,7535,6292,7199,6292,7199,6435,1477,5039,1445,5039,1445)
canvas.create_polygon(*coordinates[0],fill='#ffffff',smooth=1,tag='pingu')
move_to(4872,2234)
becier(4949,2230,5014,2319,5019,2432,5024,2544,4966,2638,4890,2642,4813,2645,4747,2556,4743,2443,4738,2331,4796,2237,4872,2234)
canvas.create_polygon(*coordinates[0],fill='#010101',smooth=1,tag='pingu')
move_to(4071,2482)
becier(4037,2372,4073,2263,4149,2240,4226,2217,4315,2288,4349,2399,4382,2509,4347,2618,4270,2641,4193,2664,4104,2593,4071,2482)
canvas.create_polygon(*coordinates[0],fill='#010101',smooth=1,tag='pingu')
move_to(4965,3769)
becier(4965,3769,4443,3563,4235,2961,4235,2961,4658,2787,5044,2921,5044,2921,5186,3294,4965,3769)
canvas.create_polygon(*coordinates[0],fill='#010101',smooth=1,tag='pingu')
canvas.scale('pingu',0,0,scale,scale)
root.mainloop()
Dass man den Murx mit den Listen nicht macht, sollte Dir doch inzwischen klar sein. Keine globalen Variablen! Würde Dir auch nicht passieren, wenn Du alles in Funktionen packst.
Wenn Du jetzt noch das smooth wegläßt sieht es doch schon ganz gut aus:
Wenn Du jetzt noch das smooth wegläßt sieht es doch schon ganz gut aus:
Code: Alles auswählen
import tkinter as tk
class Curve(object):
def __init__(self, x,y, precision=30):
self.coordinates = [x,y]
self.precision = precision
def __iter__(self):
return iter(self.coordinates)
def line_to(self, *coords):
self.coordinates.extend(coords)
def bezier_to(self, *coords):
coords = iter(coords)
px0, py0 = self.coordinates[-2:]
for px1, py1, px2, py2, px3, py3 in zip(*[coords]*6):
# B(t) = (1-t)^3 * P0 + 3t * (1-t)^2 * P1 + 3 t^2 * (1-t) * P2 + t^3 * P3
for T in range(1,self.precision+1):
t = T/self.precision
Bx = (1-t)*(1-t)*(1-t)*px0 + 3*t*(1-t)*(1-t)*px1+3*t*t*(1-t)*px2+t*t*t*px3
By = (1-t)*(1-t)*(1-t)*py0 + 3*t*(1-t)*(1-t)*py1+3*t*t*(1-t)*py2+t*t*t*py3
self.coordinates.extend((Bx, By))
px0, py0 = px3, py3
def main():
root = tk.Tk()
canvas = tk.Canvas(root,width=400,height=350)
canvas.pack()
scale = 0.03
c = Curve(8988,4286)
c.line_to(9770,3752,8655,3425)
c.bezier_to(7723,1788,5822,2642,5186,4199,4420,6075,2224,6760,2224,6760,3787,8619,5196,8954,6136,8880,7077,8806,9615,8066,9087,4766,9059,4595,9026,4435,8988,4286)
canvas.create_polygon(*c,tags="img", fill='#2ba9e1')
c = Curve(8655,3426)
c.bezier_to(8788,3660,8901,3945,8988,4286)
c.line_to(9770,3753,8655,3426)
canvas.create_polygon(*c, tags="img", fill='#2b3277')
c = Curve(7412,5497)
c.bezier_to(7412,5497,4803,4959,4503,6411,4204,7863,6613,8705,7412,5497)
canvas.create_polygon(*c, tags="img", fill='#2b3277')
c = Curve(7915,3385)
c.bezier_to(7932,3541,7852,3678,7735,3691,7618,3705,7509,3589,7491,3433,7473,3278,7554,3140,7671,3127,7788,3114,7897,3229,7915,3385)
canvas.create_polygon(*c, tags="img", fill='#2b3277')
canvas.scale("img",0,0,scale,scale)
root.mainloop()
if __name__ == '__main__':
main()
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
@Sirius3 Dass das mit der Liste normalerweise Murks ist, ist auch klar. Wenn man den smooth nicht macht, sondern ihn selber durch höhere Precision realisisiert, dann wird es auch genau und auch gerade Linien stellen dann kein Problem dar.
Was noch zu klären ist, sind Farbwechsel. Beim Pinguin war zuerst die Farbe schwarz. Dann kam weiss. Dann dachte ich, dass wenn weiss angegeben ist, dass das dann auch weiterhin gilt. Aber nein, ich mußte dann die Farbe wieder auf schwarz setzen.
Da muss man sich näher betrachten, wie das definiert ist, wann die Farbe wechselt.
Was noch zu klären ist, sind Farbwechsel. Beim Pinguin war zuerst die Farbe schwarz. Dann kam weiss. Dann dachte ich, dass wenn weiss angegeben ist, dass das dann auch weiterhin gilt. Aber nein, ich mußte dann die Farbe wieder auf schwarz setzen.
Da muss man sich näher betrachten, wie das definiert ist, wann die Farbe wechselt.
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
Also, Farbgebung ist nicht einfach. Nicht einmal LibreOffice Draw macht es hier richtig:
Aber gThumb kann es und vergißt nicht die drei Falten am Rüssel:
Aber gThumb kann es und vergißt nicht die drei Falten am Rüssel:
@Alfons Mittelmeyer: LibreOffice ist nicht unbedingt das beste Programm um SVG-Grafiken zu bearbeiten weil das Grafik-Format von LibreOffice, und damit auch der Editor, nicht den vollen SVG-Umfang unterstützt. Inkscape ist da beispielsweise wesentlich besser geeignet. Das verwendet auch intern SVG als Format.
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
@BlackJack Ich will ja auch keine SVG Grafiken bearbeiten. Ich wollte nur darauf hinweisen, dass SVG nicht ganz so einfach ist, wie mancher vielleicht es sich vorstellt. Direkt SVG automatisch nach tkinter konvertieren geht nicht, da SVG sich etwas anders verhält, als mancher vielleicht denkt.
Was geschieht etwa, wenn man eine Fläche gezeichnet hat und eine größere Fläche in anderer Farbe darüber legt?
Die darübergelegte Fläche sollte die darunter verdecken, möchte man meinen.
Aber nein in SVG ist es so nicht. Die darübergelegte Fläche endet an der bereits vorhandenen und bildet so eine Umrahmung derselben.
Tja, das geht in tkinter nicht. Also muss man die Reihenfolge vertauschen und erst die größere Fläche zeichnen und danach erst die darin.
Was geschieht etwa, wenn man einen Teil einer Fläche in anderen Farbe übermalt hat, etwa den schwarzen Rock eines Pinguins mit einem weißem Gesicht und weißem Bauch.
Was geschieht, wenn man noch zusätzlich mit weiß darauf malt? Das wirkt dann wie ein Radiergummi und löscht dann das Weiß auf dem schwarzen Rock wieder weg, sodaß dort der schwarze Rock wieder durchschaut.
Um das dann richtig zu machen, muß man dort die richtige Farbe einstellen, also schwarz statt weiß. Mitunter auch die Hintergrundfarbe des Canvas (etwa Elefant).
Was geschieht etwa, wenn man eine Fläche gezeichnet hat und eine größere Fläche in anderer Farbe darüber legt?
Die darübergelegte Fläche sollte die darunter verdecken, möchte man meinen.
Aber nein in SVG ist es so nicht. Die darübergelegte Fläche endet an der bereits vorhandenen und bildet so eine Umrahmung derselben.
Tja, das geht in tkinter nicht. Also muss man die Reihenfolge vertauschen und erst die größere Fläche zeichnen und danach erst die darin.
Was geschieht etwa, wenn man einen Teil einer Fläche in anderen Farbe übermalt hat, etwa den schwarzen Rock eines Pinguins mit einem weißem Gesicht und weißem Bauch.
Was geschieht, wenn man noch zusätzlich mit weiß darauf malt? Das wirkt dann wie ein Radiergummi und löscht dann das Weiß auf dem schwarzen Rock wieder weg, sodaß dort der schwarze Rock wieder durchschaut.
Um das dann richtig zu machen, muß man dort die richtige Farbe einstellen, also schwarz statt weiß. Mitunter auch die Hintergrundfarbe des Canvas (etwa Elefant).
@Alfons Mittelmeyer: Oh man, Du solltest echt weniger rumschwafeln und vielleicht mal die Spezifikation von SVG lesen statt es durch Versuch und Irrtum zu solch ausschweifenden und teilweise irreführenden Beschreibungen zu kommen. SVG verhält sich nicht anders als ”mancher” sich das denkt, sondern anscheinend hauptsächlich wie *Du* dir das wohl gedacht hast.
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
@BlackJack Wenn Du anscheinend so gescheit bist, vielleicht kannst ja Du dann erklären, wie die Löcher in den Käse kommen.
Also eine Scheibe Käse zeichnen und Löcher herausschneiden sieht gleich aus. Die Frage ist da, wann zeichnet man eine Scheibe Käse und wann schneidet man da Löcher heraus.
Die Regel nach der Spezifikation bei fill-rule evenodd ist folgende:
evenodd
This rule determines the "insideness" of a point on the canvas by drawing a ray from that point to infinity in any direction and counting the number of path segments from the given shape that the ray crosses. If this number is odd, the point is inside; if even, the point is outside.
Vielleicht magst Du das ja näher erklären?
PS:
Und dass ein Loch in einer Wand etwas anderes ist, wie wenn man ein Viereck auf eine Wand malt, sollte auch klar sein. Denn das eine ist ein Fenster, durch das man durchschauen kann. Und mit tkinter ein Viereck auf eine Wand malen ergibt nicht den selben Effekt.
Also eine Scheibe Käse zeichnen und Löcher herausschneiden sieht gleich aus. Die Frage ist da, wann zeichnet man eine Scheibe Käse und wann schneidet man da Löcher heraus.
Die Regel nach der Spezifikation bei fill-rule evenodd ist folgende:
evenodd
This rule determines the "insideness" of a point on the canvas by drawing a ray from that point to infinity in any direction and counting the number of path segments from the given shape that the ray crosses. If this number is odd, the point is inside; if even, the point is outside.
Vielleicht magst Du das ja näher erklären?
PS:
Und dass ein Loch in einer Wand etwas anderes ist, wie wenn man ein Viereck auf eine Wand malt, sollte auch klar sein. Denn das eine ist ein Fenster, durch das man durchschauen kann. Und mit tkinter ein Viereck auf eine Wand malen ergibt nicht den selben Effekt.
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
Jedenfalls, wenn man innerhalb eines shapes innerhalb einer gefülltem Fläche nochmals eine Fläche zeichnet, zählt diese bei fill-rule evenodd als Loch. Bei fill-rule nonzero käme es noch darauf an, ob man den Pfad dann im oder entgegen dem Uhrzeigersinn angibt.
Wenn hinter dem Loch nur einfarbiger Hintergrund liegt, kann man statt Loch diese Fläche in dieser Hintergrundfarbe zeichnen. Wenn hinter dem Loch aber bereits ein Objekt ist, dieses das Loch aber nicht überschneidet, kann man die Reihenfolge tauschen. Wenn das Objekt aber größer als das Loch ist, hat man eventuell Pech gehabt.
Wenn hinter dem Loch nur einfarbiger Hintergrund liegt, kann man statt Loch diese Fläche in dieser Hintergrundfarbe zeichnen. Wenn hinter dem Loch aber bereits ein Objekt ist, dieses das Loch aber nicht überschneidet, kann man die Reihenfolge tauschen. Wenn das Objekt aber größer als das Loch ist, hat man eventuell Pech gehabt.